summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-07-24 15:21:35 -0500
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-07-24 15:21:35 -0500
commit093ed975800ab1e5c0d73759f07fedf8d5aa2ca6 (patch)
treed625ba687b185a3984a410f56d9c2e0dade7b114
downloadkftpgrabber-093ed975800ab1e5c0d73759f07fedf8d5aa2ca6.tar.gz
kftpgrabber-093ed975800ab1e5c0d73759f07fedf8d5aa2ca6.zip
Initial import of kftpgrabber 0.8.1 from sources
-rw-r--r--AUTHORS2
-rw-r--r--COPYING280
-rw-r--r--ChangeLog65
-rw-r--r--INSTALL167
-rw-r--r--Makefile.am5
-rw-r--r--Makefile.am.in4
-rw-r--r--README89
-rw-r--r--TODO1
-rw-r--r--acinclude.m411920
-rw-r--r--aclocal.m4863
-rw-r--r--config.h.in363
-rw-r--r--configure.files4
-rw-r--r--configure.in322
-rw-r--r--configure.in.bot4
-rw-r--r--configure.in.in11
-rw-r--r--kftpgrabber/COPYING-DOCS397
-rw-r--r--kftpgrabber/LICENSE.OpenSSL127
-rw-r--r--kftpgrabber/Makefile.am12
-rw-r--r--kftpgrabber/NEWS0
-rw-r--r--kftpgrabber/Roadmap33
-rw-r--r--kftpgrabber/configure.in.in110
-rw-r--r--kftpgrabber/src/Makefile.am59
-rw-r--r--kftpgrabber/src/checksumverifier.cpp272
-rw-r--r--kftpgrabber/src/checksumverifier.h136
-rw-r--r--kftpgrabber/src/directoryscanner.cpp178
-rw-r--r--kftpgrabber/src/directoryscanner.h106
-rw-r--r--kftpgrabber/src/engine/Makefile.am11
-rw-r--r--kftpgrabber/src/engine/cache.cpp175
-rw-r--r--kftpgrabber/src/engine/cache.h176
-rw-r--r--kftpgrabber/src/engine/commands.cpp78
-rw-r--r--kftpgrabber/src/engine/commands.h136
-rw-r--r--kftpgrabber/src/engine/connectionretry.cpp112
-rw-r--r--kftpgrabber/src/engine/connectionretry.h86
-rw-r--r--kftpgrabber/src/engine/directorylisting.cpp188
-rw-r--r--kftpgrabber/src/engine/directorylisting.h141
-rw-r--r--kftpgrabber/src/engine/event.cpp166
-rw-r--r--kftpgrabber/src/engine/event.h372
-rw-r--r--kftpgrabber/src/engine/ftpdirectoryparser.cpp1144
-rw-r--r--kftpgrabber/src/engine/ftpdirectoryparser.h92
-rw-r--r--kftpgrabber/src/engine/ftpsocket.cpp2749
-rw-r--r--kftpgrabber/src/engine/ftpsocket.h154
-rw-r--r--kftpgrabber/src/engine/sftpsocket.cpp775
-rw-r--r--kftpgrabber/src/engine/sftpsocket.h92
-rw-r--r--kftpgrabber/src/engine/socket.cpp866
-rw-r--r--kftpgrabber/src/engine/socket.h605
-rw-r--r--kftpgrabber/src/engine/speedlimiter.cpp240
-rw-r--r--kftpgrabber/src/engine/speedlimiter.h158
-rw-r--r--kftpgrabber/src/engine/ssl.cpp264
-rw-r--r--kftpgrabber/src/engine/ssl.h176
-rw-r--r--kftpgrabber/src/engine/thread.cpp346
-rw-r--r--kftpgrabber/src/engine/thread.h133
-rw-r--r--kftpgrabber/src/hi16-app-kftpgrabber.pngbin0 -> 861 bytes
-rw-r--r--kftpgrabber/src/hi22-app-kftpgrabber.pngbin0 -> 1401 bytes
-rw-r--r--kftpgrabber/src/hi32-app-kftpgrabber.pngbin0 -> 2224 bytes
-rw-r--r--kftpgrabber/src/hi48-app-kftpgrabber.pngbin0 -> 4175 bytes
-rw-r--r--kftpgrabber/src/hi64-app-kftpgrabber.pngbin0 -> 5445 bytes
-rw-r--r--kftpgrabber/src/kftpbookmarkaction.cpp62
-rw-r--r--kftpgrabber/src/kftpbookmarkaction.h113
-rw-r--r--kftpgrabber/src/kftpbookmarks.cpp948
-rw-r--r--kftpgrabber/src/kftpbookmarks.h160
-rw-r--r--kftpgrabber/src/kftpfileexistsactions.cpp164
-rw-r--r--kftpgrabber/src/kftpfileexistsactions.h138
-rw-r--r--kftpgrabber/src/kftpgrabber-bi-wizard.pngbin0 -> 67270 bytes
-rw-r--r--kftpgrabber/src/kftpgrabber-logo.pngbin0 -> 212636 bytes
-rw-r--r--kftpgrabber/src/kftpgrabber.desktop73
-rw-r--r--kftpgrabber/src/kftpgrabberui.rc31
-rw-r--r--kftpgrabber/src/kftpqueue.cpp834
-rw-r--r--kftpgrabber/src/kftpqueue.h531
-rw-r--r--kftpgrabber/src/kftpqueueconverter.cpp211
-rw-r--r--kftpgrabber/src/kftpqueueconverter.h82
-rw-r--r--kftpgrabber/src/kftpqueueprocessor.cpp137
-rw-r--r--kftpgrabber/src/kftpqueueprocessor.h76
-rw-r--r--kftpgrabber/src/kftpsession.cpp920
-rw-r--r--kftpgrabber/src/kftpsession.h616
-rw-r--r--kftpgrabber/src/kftptransfer.cpp374
-rw-r--r--kftpgrabber/src/kftptransfer.h337
-rw-r--r--kftpgrabber/src/kftptransferdir.cpp151
-rw-r--r--kftpgrabber/src/kftptransferdir.h87
-rw-r--r--kftpgrabber/src/kftptransferfile.cpp413
-rw-r--r--kftpgrabber/src/kftptransferfile.h127
-rw-r--r--kftpgrabber/src/main.cpp137
-rw-r--r--kftpgrabber/src/mainactions.cpp189
-rw-r--r--kftpgrabber/src/mainactions.h115
-rw-r--r--kftpgrabber/src/mainwindow.cpp447
-rw-r--r--kftpgrabber/src/mainwindow.h141
-rw-r--r--kftpgrabber/src/misc/Makefile.am23
-rw-r--r--kftpgrabber/src/misc/config.kcfgc7
-rw-r--r--kftpgrabber/src/misc/configbase.cpp141
-rw-r--r--kftpgrabber/src/misc/configbase.h137
-rw-r--r--kftpgrabber/src/misc/customcommands/Makefile.am16
-rw-r--r--kftpgrabber/src/misc/customcommands/commands.xml113
-rw-r--r--kftpgrabber/src/misc/customcommands/entry.cpp155
-rw-r--r--kftpgrabber/src/misc/customcommands/entry.h236
-rw-r--r--kftpgrabber/src/misc/customcommands/handlers.cpp97
-rw-r--r--kftpgrabber/src/misc/customcommands/handlers.h147
-rw-r--r--kftpgrabber/src/misc/customcommands/manager.cpp211
-rw-r--r--kftpgrabber/src/misc/customcommands/manager.h118
-rw-r--r--kftpgrabber/src/misc/customcommands/parameterentrydialog.cpp131
-rw-r--r--kftpgrabber/src/misc/customcommands/parameterentrydialog.h79
-rw-r--r--kftpgrabber/src/misc/customcommands/responsedialog.cpp60
-rw-r--r--kftpgrabber/src/misc/customcommands/responsedialog.h65
-rw-r--r--kftpgrabber/src/misc/desencryptor.cpp119
-rw-r--r--kftpgrabber/src/misc/desencryptor.h71
-rw-r--r--kftpgrabber/src/misc/filter.cpp421
-rw-r--r--kftpgrabber/src/misc/filter.h506
-rw-r--r--kftpgrabber/src/misc/filterwidgethandler.cpp539
-rw-r--r--kftpgrabber/src/misc/filterwidgethandler.h279
-rw-r--r--kftpgrabber/src/misc/interfaces/Makefile.am15
-rw-r--r--kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.cpp55
-rw-r--r--kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.desktop29
-rw-r--r--kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.h83
-rw-r--r--kftpgrabber/src/misc/kftpapi.cpp81
-rw-r--r--kftpgrabber/src/misc/kftpapi.h73
-rw-r--r--kftpgrabber/src/misc/kftpgrabber.kcfg319
-rw-r--r--kftpgrabber/src/misc/kftpotpgenerator.cpp470
-rw-r--r--kftpgrabber/src/misc/kftpotpgenerator.h75
-rw-r--r--kftpgrabber/src/misc/kftppluginmanager.cpp76
-rw-r--r--kftpgrabber/src/misc/kftppluginmanager.h82
-rw-r--r--kftpgrabber/src/misc/kftpwalletconnection.cpp166
-rw-r--r--kftpgrabber/src/misc/kftpwalletconnection.h68
-rw-r--r--kftpgrabber/src/misc/kftpzeroconf.cpp67
-rw-r--r--kftpgrabber/src/misc/kftpzeroconf.h70
-rw-r--r--kftpgrabber/src/misc/libs/Makefile.am3
-rw-r--r--kftpgrabber/src/misc/libs/ssh/Makefile.am8
-rw-r--r--kftpgrabber/src/misc/libs/ssh/auth.c597
-rw-r--r--kftpgrabber/src/misc/libs/ssh/base64.c210
-rw-r--r--kftpgrabber/src/misc/libs/ssh/buffer.c161
-rw-r--r--kftpgrabber/src/misc/libs/ssh/channels.c691
-rw-r--r--kftpgrabber/src/misc/libs/ssh/client.c261
-rw-r--r--kftpgrabber/src/misc/libs/ssh/connect.c295
-rw-r--r--kftpgrabber/src/misc/libs/ssh/crypt.c100
-rw-r--r--kftpgrabber/src/misc/libs/ssh/crypto.h47
-rw-r--r--kftpgrabber/src/misc/libs/ssh/dh.c411
-rw-r--r--kftpgrabber/src/misc/libs/ssh/error.c67
-rw-r--r--kftpgrabber/src/misc/libs/ssh/gzip.c140
-rw-r--r--kftpgrabber/src/misc/libs/ssh/kex.c264
-rw-r--r--kftpgrabber/src/misc/libs/ssh/keyfiles.c341
-rw-r--r--kftpgrabber/src/misc/libs/ssh/keys.c353
-rw-r--r--kftpgrabber/src/misc/libs/ssh/libssh.h218
-rw-r--r--kftpgrabber/src/misc/libs/ssh/misc.c98
-rw-r--r--kftpgrabber/src/misc/libs/ssh/options.c341
-rw-r--r--kftpgrabber/src/misc/libs/ssh/packet.c303
-rw-r--r--kftpgrabber/src/misc/libs/ssh/priv.h384
-rw-r--r--kftpgrabber/src/misc/libs/ssh/sftp.c1289
-rw-r--r--kftpgrabber/src/misc/libs/ssh/sftp.h225
-rw-r--r--kftpgrabber/src/misc/libs/ssh/ssh2.h69
-rw-r--r--kftpgrabber/src/misc/libs/ssh/string.c65
-rw-r--r--kftpgrabber/src/misc/libs/ssh/wrapper.c241
-rw-r--r--kftpgrabber/src/misc/misc.cpp193
-rw-r--r--kftpgrabber/src/misc/misc.h74
-rw-r--r--kftpgrabber/src/misc/plugins/Makefile.am3
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/Makefile.am3
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/Makefile.am14
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp166
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.h82
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportplugin_filezilla3.desktop38
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/gftp/Makefile.am14
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp236
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.h83
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportplugin_gftp.desktop61
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/kftp/Makefile.am14
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp118
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.h83
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportplugin_kftp.desktop57
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/Makefile.am14
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp165
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.h80
-rw-r--r--kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportplugin_ncftp.desktop62
-rw-r--r--kftpgrabber/src/queuegroup.cpp128
-rw-r--r--kftpgrabber/src/queuegroup.h104
-rw-r--r--kftpgrabber/src/queueobject.cpp275
-rw-r--r--kftpgrabber/src/queueobject.h372
-rw-r--r--kftpgrabber/src/site.cpp99
-rw-r--r--kftpgrabber/src/site.h89
-rw-r--r--kftpgrabber/src/statistics.cpp89
-rw-r--r--kftpgrabber/src/statistics.h117
-rw-r--r--kftpgrabber/src/ui/Makefile.am16
-rw-r--r--kftpgrabber/src/ui/bookmark_properties.ui620
-rw-r--r--kftpgrabber/src/ui/checksum_verifier.ui340
-rw-r--r--kftpgrabber/src/ui/config_display.ui137
-rw-r--r--kftpgrabber/src/ui/config_filters.ui137
-rw-r--r--kftpgrabber/src/ui/config_general.ui440
-rw-r--r--kftpgrabber/src/ui/config_log.ui355
-rw-r--r--kftpgrabber/src/ui/config_transfers.ui734
-rw-r--r--kftpgrabber/src/ui/foobar.cpp19
-rw-r--r--kftpgrabber/src/ui/foobar.h24
-rw-r--r--kftpgrabber/src/ui/kftpbookmarkeditortlswidget.ui173
-rw-r--r--kftpgrabber/src/ui/kftpbookmarkimportlayout.ui280
-rw-r--r--kftpgrabber/src/ui/kftpfilteraddpatternlayout.ui125
-rw-r--r--kftpgrabber/src/ui/kftpqueueeditorlayout.ui327
-rw-r--r--kftpgrabber/src/ui/kftpquickconnectlayout.ui538
-rw-r--r--kftpgrabber/src/ui/kftpsearchlayout.ui245
-rw-r--r--kftpgrabber/src/widgets/Makefile.am28
-rw-r--r--kftpgrabber/src/widgets/balloon.cpp145
-rw-r--r--kftpgrabber/src/widgets/balloon.h86
-rw-r--r--kftpgrabber/src/widgets/bookmarks/Makefile.am13
-rw-r--r--kftpgrabber/src/widgets/bookmarks/editor.cpp492
-rw-r--r--kftpgrabber/src/widgets/bookmarks/editor.h133
-rw-r--r--kftpgrabber/src/widgets/bookmarks/editortls.cpp115
-rw-r--r--kftpgrabber/src/widgets/bookmarks/editortls.h85
-rw-r--r--kftpgrabber/src/widgets/bookmarks/importwizard.cpp167
-rw-r--r--kftpgrabber/src/widgets/bookmarks/importwizard.h85
-rw-r--r--kftpgrabber/src/widgets/bookmarks/listview.cpp532
-rw-r--r--kftpgrabber/src/widgets/bookmarks/listview.h193
-rw-r--r--kftpgrabber/src/widgets/bookmarks/sidebar.cpp158
-rw-r--r--kftpgrabber/src/widgets/bookmarks/sidebar.h88
-rw-r--r--kftpgrabber/src/widgets/browser/Makefile.am13
-rw-r--r--kftpgrabber/src/widgets/browser/actions.cpp764
-rw-r--r--kftpgrabber/src/widgets/browser/actions.h189
-rw-r--r--kftpgrabber/src/widgets/browser/detailsview.cpp596
-rw-r--r--kftpgrabber/src/widgets/browser/detailsview.h374
-rw-r--r--kftpgrabber/src/widgets/browser/dirlister.cpp169
-rw-r--r--kftpgrabber/src/widgets/browser/dirlister.h157
-rw-r--r--kftpgrabber/src/widgets/browser/filterwidget.cpp118
-rw-r--r--kftpgrabber/src/widgets/browser/filterwidget.h97
-rw-r--r--kftpgrabber/src/widgets/browser/locationnavigator.cpp173
-rw-r--r--kftpgrabber/src/widgets/browser/locationnavigator.h210
-rw-r--r--kftpgrabber/src/widgets/browser/propsplugin.cpp360
-rw-r--r--kftpgrabber/src/widgets/browser/propsplugin.h98
-rw-r--r--kftpgrabber/src/widgets/browser/treeview.cpp520
-rw-r--r--kftpgrabber/src/widgets/browser/treeview.h189
-rw-r--r--kftpgrabber/src/widgets/browser/view.cpp456
-rw-r--r--kftpgrabber/src/widgets/browser/view.h258
-rw-r--r--kftpgrabber/src/widgets/configdialog.cpp187
-rw-r--r--kftpgrabber/src/widgets/configdialog.h71
-rw-r--r--kftpgrabber/src/widgets/configfilter.cpp137
-rw-r--r--kftpgrabber/src/widgets/configfilter.h79
-rw-r--r--kftpgrabber/src/widgets/failedtransfers.cpp213
-rw-r--r--kftpgrabber/src/widgets/failedtransfers.h111
-rw-r--r--kftpgrabber/src/widgets/filtereditor.cpp625
-rw-r--r--kftpgrabber/src/widgets/filtereditor.h375
-rw-r--r--kftpgrabber/src/widgets/kftpfilteraddpatternlayout.cpp92
-rw-r--r--kftpgrabber/src/widgets/kftpfiltereditorlayout.cpp115
-rw-r--r--kftpgrabber/src/widgets/kftpselectserverdialog.cpp79
-rw-r--r--kftpgrabber/src/widgets/kftpselectserverdialog.h70
-rw-r--r--kftpgrabber/src/widgets/kftpserverlineedit.cpp105
-rw-r--r--kftpgrabber/src/widgets/kftpserverlineedit.h71
-rw-r--r--kftpgrabber/src/widgets/kftptabwidget.cpp53
-rw-r--r--kftpgrabber/src/widgets/kftptabwidget.h60
-rw-r--r--kftpgrabber/src/widgets/kftpzeroconflistview.cpp98
-rw-r--r--kftpgrabber/src/widgets/kftpzeroconflistview.h56
-rw-r--r--kftpgrabber/src/widgets/listview.cpp85
-rw-r--r--kftpgrabber/src/widgets/listview.h63
-rw-r--r--kftpgrabber/src/widgets/listviewitem.cpp96
-rw-r--r--kftpgrabber/src/widgets/listviewitem.h71
-rw-r--r--kftpgrabber/src/widgets/logview.cpp143
-rw-r--r--kftpgrabber/src/widgets/logview.h73
-rw-r--r--kftpgrabber/src/widgets/multitabbar.cpp1160
-rw-r--r--kftpgrabber/src/widgets/multitabbar.h281
-rw-r--r--kftpgrabber/src/widgets/multitabbar_p.h85
-rw-r--r--kftpgrabber/src/widgets/overlaywidget.cpp83
-rw-r--r--kftpgrabber/src/widgets/overlaywidget.h60
-rw-r--r--kftpgrabber/src/widgets/popupmessage.cpp314
-rw-r--r--kftpgrabber/src/widgets/popupmessage.h113
-rw-r--r--kftpgrabber/src/widgets/queueview/Makefile.am13
-rw-r--r--kftpgrabber/src/widgets/queueview/queueeditor.cpp323
-rw-r--r--kftpgrabber/src/widgets/queueview/queueeditor.h82
-rw-r--r--kftpgrabber/src/widgets/queueview/queueview.cpp888
-rw-r--r--kftpgrabber/src/widgets/queueview/queueview.h296
-rw-r--r--kftpgrabber/src/widgets/queueview/threadview.cpp202
-rw-r--r--kftpgrabber/src/widgets/queueview/threadview.h93
-rw-r--r--kftpgrabber/src/widgets/quickconnect.cpp476
-rw-r--r--kftpgrabber/src/widgets/quickconnect.h162
-rw-r--r--kftpgrabber/src/widgets/searchdialog.cpp165
-rw-r--r--kftpgrabber/src/widgets/searchdialog.h85
-rw-r--r--kftpgrabber/src/widgets/sidebar.cpp393
-rw-r--r--kftpgrabber/src/widgets/sidebar.h157
-rw-r--r--kftpgrabber/src/widgets/systemtray.cpp123
-rw-r--r--kftpgrabber/src/widgets/systemtray.h93
-rw-r--r--kftpgrabber/src/widgets/trafficgraph.cpp628
-rw-r--r--kftpgrabber/src/widgets/trafficgraph.h155
-rw-r--r--kftpgrabber/src/widgets/verifier.cpp148
-rw-r--r--kftpgrabber/src/widgets/verifier.h74
-rw-r--r--kftpgrabber/src/widgets/widgetlister.cpp172
-rw-r--r--kftpgrabber/src/widgets/widgetlister.h177
-rw-r--r--stamp-h.in0
-rw-r--r--subdirs2
-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/kftpgrabber.po2886
-rw-r--r--translations/bg/Makefile.am1
-rw-r--r--translations/bg/messages/Makefile.am3
-rw-r--r--translations/bg/messages/kftpgrabber.po2966
-rw-r--r--translations/br/Makefile.am1
-rw-r--r--translations/br/messages/Makefile.am3
-rw-r--r--translations/br/messages/kftpgrabber.po3112
-rw-r--r--translations/cs/Makefile.am1
-rw-r--r--translations/cs/messages/Makefile.am3
-rw-r--r--translations/cs/messages/kftpgrabber.po3156
-rw-r--r--translations/cy/Makefile.am1
-rw-r--r--translations/cy/messages/Makefile.am3
-rw-r--r--translations/cy/messages/kftpgrabber.po3002
-rw-r--r--translations/da/Makefile.am1
-rw-r--r--translations/da/messages/Makefile.am3
-rw-r--r--translations/da/messages/kftpgrabber.po3620
-rw-r--r--translations/de/Makefile.am1
-rw-r--r--translations/de/messages/Makefile.am3
-rw-r--r--translations/de/messages/kftpgrabber.po2994
-rw-r--r--translations/el/Makefile.am1
-rw-r--r--translations/el/messages/Makefile.am3
-rw-r--r--translations/el/messages/kftpgrabber.po2976
-rw-r--r--translations/en_GB/Makefile.am1
-rw-r--r--translations/en_GB/messages/Makefile.am3
-rw-r--r--translations/en_GB/messages/kftpgrabber.po3721
-rw-r--r--translations/es/Makefile.am1
-rw-r--r--translations/es/messages/Makefile.am3
-rw-r--r--translations/es/messages/kftpgrabber.po2997
-rw-r--r--translations/et/Makefile.am1
-rw-r--r--translations/et/messages/Makefile.am3
-rw-r--r--translations/et/messages/kftpgrabber.po3488
-rw-r--r--translations/fr/Makefile.am1
-rw-r--r--translations/fr/messages/Makefile.am3
-rw-r--r--translations/fr/messages/kftpgrabber.po3676
-rw-r--r--translations/ga/Makefile.am1
-rw-r--r--translations/ga/messages/Makefile.am3
-rw-r--r--translations/ga/messages/kftpgrabber.po3233
-rw-r--r--translations/gl/Makefile.am1
-rw-r--r--translations/gl/messages/Makefile.am3
-rw-r--r--translations/gl/messages/kftpgrabber.po3512
-rw-r--r--translations/hu/Makefile.am1
-rw-r--r--translations/hu/messages/Makefile.am3
-rw-r--r--translations/hu/messages/kftpgrabber.po3432
-rw-r--r--translations/it/Makefile.am1
-rw-r--r--translations/it/messages/Makefile.am3
-rw-r--r--translations/it/messages/kftpgrabber.po2977
-rw-r--r--translations/ja/Makefile.am1
-rw-r--r--translations/ja/messages/Makefile.am3
-rw-r--r--translations/ja/messages/kftpgrabber.po2905
-rw-r--r--translations/ka/Makefile.am1
-rw-r--r--translations/ka/messages/Makefile.am3
-rw-r--r--translations/ka/messages/kftpgrabber.po3616
-rw-r--r--translations/lt/Makefile.am1
-rw-r--r--translations/lt/messages/Makefile.am3
-rw-r--r--translations/lt/messages/kftpgrabber.po3016
-rw-r--r--translations/nl/Makefile.am1
-rw-r--r--translations/nl/messages/Makefile.am3
-rw-r--r--translations/nl/messages/kftpgrabber.po2991
-rw-r--r--translations/pl/Makefile.am1
-rw-r--r--translations/pl/messages/Makefile.am3
-rw-r--r--translations/pl/messages/kftpgrabber.po3464
-rw-r--r--translations/pt/Makefile.am1
-rw-r--r--translations/pt/messages/Makefile.am3
-rw-r--r--translations/pt/messages/kftpgrabber.po2984
-rw-r--r--translations/rw/Makefile.am1
-rw-r--r--translations/rw/messages/Makefile.am3
-rw-r--r--translations/rw/messages/kftpgrabber.po3987
-rw-r--r--translations/sk/Makefile.am1
-rw-r--r--translations/sk/messages/Makefile.am3
-rw-r--r--translations/sk/messages/kftpgrabber.po2883
-rw-r--r--translations/sr/Makefile.am1
-rw-r--r--translations/sr/messages/Makefile.am3
-rw-r--r--translations/sr/messages/kftpgrabber.po3652
-rw-r--r--translations/sr@Latn/Makefile.am1
-rw-r--r--translations/sr@Latn/messages/Makefile.am3
-rw-r--r--translations/sr@Latn/messages/kftpgrabber.po3653
-rw-r--r--translations/sv/Makefile.am1
-rw-r--r--translations/sv/messages/Makefile.am3
-rw-r--r--translations/sv/messages/kftpgrabber.po2945
-rw-r--r--translations/tr/Makefile.am1
-rw-r--r--translations/tr/messages/Makefile.am3
-rw-r--r--translations/tr/messages/kftpgrabber.po3638
-rw-r--r--translations/zh_CN/Makefile.am1
-rw-r--r--translations/zh_CN/messages/Makefile.am3
-rw-r--r--translations/zh_CN/messages/kftpgrabber.po2928
365 files changed, 164223 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..5b4fb89
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,2 @@
+Jernej Kos <kostko@jweb-network.net>
+Markus Brueffer <markus@brueffer.de>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..6ae4063
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,280 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Steet, 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
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e02cfcb
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,65 @@
+KFTPGrabber Changelog
+=====================
+(c) 2003-2005 the KFTPGrabber developers.
+
+VERSION 0.6.0
+ FIX: Resuming files using SFTP
+ FIX: Do not refetch directory listings while processing the queue
+ FIX: Queue/server management related crash
+ FIX: Incorrect directory progress when aborting transfer
+
+VERSION 0.6.0-beta2
+ FIX: Request for password when selecting anonymous in quick connect dialog
+ FIX: Set the correct home dir on some remote connections
+ FIX: Bookmark related crash
+ FIX: Proper encoding of URLs in the queue file
+ FIX: One month timeshift when doing MDTM
+
+VERSION 0.6.0-beta1
+ ADD: According to the KDE HIG minimize to tray if the mainwindow is closed
+ ADD: Experimental support for multiple threads
+ ADD: Traffic graph
+ ADD: Commonly used site commands for GlFTPD (more to follow)
+ ADD: Support for setting per-site encoding
+ CHG: Updated libssh to the latest version to support keyboard-interactive auth
+ CHG: Removed howl in favor of KDNSSD Zeroconf API
+ FIX: Lots of crash fixes
+ FIX: Rewritten directory listing parser
+ FIX: Different queue improvements and bugfixes
+
+VERSION 0.5.0
+ FIX: Behaviour of the "Show Tree View" button
+ FIX: Processing of queued transfers after aborting a transfer
+ FIX: Fix a progressbar related crash
+ FIX: Many bugfixes to the quickconnect dialog
+ FIX: Adjustment of licenses (thanks to Vince <vince@kerneled.org>)
+ FIX: Support for servers that send their local IP instead of the correct one
+ FIX: Upload of files >4GB
+ FIX: FreeBSD threading lib detection
+ ADD: README and Changelog
+
+VERSION 0.5.0-beta1
+ ADD: Experimental SFTP support
+ ADD: Support of implicit SSL connections
+ ADD: Support for setting the local directory
+ ADD: Setting the password for anonymous connections is now possible
+ ADD: Using transfermodes other than plain FTP is now possible from the
+ quick connect dialog
+ ADD: Bookmark sidebar
+ ADD: Zeroconf sidebar
+ ADD: Saving the mainwindow's position
+ ADD: Password dialog for Zeroconf connections
+ ADD: Plugin framework for import filters, currently featuring a gFTP
+ import filter (more to come)
+ ADD: Option for disabling the splash screen
+ ADD: Ability to configure the default behavior of overwrite/resume/rename
+ when files already exist in local and remote directories
+ CHG: Use of KMDI for the user interface
+ CHG: Reworked bookmark editor
+ FIX: Off by one for the date's month when uploading files
+ FIX: Reconnection delay can now be up to 9999 seconds
+ FIX: Detection of QSA and Howl in the configure script
+ FIX: ETA calculation
+ FIX: Lots of compile fixes and other bugfixes
+ REM: Global option for the remote directory. The one provided by the server
+ is now used, if not being overridden by the bookmark setting
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..2369f25
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,5 @@
+AUTOMAKE_OPTIONS = foreign 1.6.1
+
+include admin/deps.am
+include admin/Doxyfile.am
+SUBDIRS=$(TOPSUBDIRS)
diff --git a/Makefile.am.in b/Makefile.am.in
new file mode 100644
index 0000000..e46b27c
--- /dev/null
+++ b/Makefile.am.in
@@ -0,0 +1,4 @@
+AUTOMAKE_OPTIONS = foreign 1.6.1
+
+include admin/deps.am
+include admin/Doxyfile.am
diff --git a/README b/README
new file mode 100644
index 0000000..54a3e9e
--- /dev/null
+++ b/README
@@ -0,0 +1,89 @@
+ KFTPGrabber README
+--------------------
+
+ INTRODUCTION
+==============
+
+KFTPGrabber - A graphical FTP client for KDE
+
+There are many FTP clients around these days. Most are console based, some
+feature a graphical user interface. What most clients are missing is support
+for latest or not so common technologies like ZeroConf, TLS/SSL or FXP (just
+to name a few), accompanied by a decent user interface that tries to support
+the user instead of frustrating him/her.
+
+KFTPGrabber tries to make a complete FTP client solution with support for
+plugins, scripting and everything else the users needs, based on the
+latest technologies provided by KDE.
+
+Here are some of the features:
+
+ - Multiple FTP sessions (tabs)
+ - Transfer queue
+ - TLS/SSL support for encrypted connections (implicit and explicit)
+ - Partial X509 certificate support for authentication
+ - FXP transfer support (site-to-site)
+ - OTP (one time password) support - S/Key, MD5, RMD160, SHA1
+ - Drag&Drop support
+ - Site bookmarking
+ - Encrypted bookmark support (password can be saved to KWallet)
+ - Distributed FTP support (PRET)
+ - SSCN and CPSV support
+ - Skiplist
+ - ZeroConf (aka. Rendezvous) support for local site discovery
+ - Bookmark sharing with Kopete contacts (KDE >= 3.3)
+ - Bookmark import plugins
+ - Support for SFTP protocol [experimental]
+
+This file was last updated with relevance to KFTPGrabber 0.8.0
+
+
+--------------------------------------------------------------------------------
+ DEPENDENCIES
+==============
+
+Required:
+ * KDElibs 3.3
+ http://www.kde.org
+
+ * OpenSSL 0.9.7
+ http://www.openssl.org
+
+Please note: If you obtain these dependencies via a packaging system, you must
+also install the devel versions of these packages!
+
+
+--------------------------------------------------------------------------------
+ IMPORTANT INSTALL INSTRUCTIONS
+================================
+
+In order to compile and install KFTPGrabber on your system, type the following
+in the base directory of the KFTPGrabber distribution:
+
+
+ % ./configure --prefix=`kde-config --prefix`
+ % make
+ % make install
+
+
+Note: --enable-final is not supported.
+
+Packages for popular distributions are available at http://www.kftp.org/
+
+
+--------------------------------------------------------------------------------
+ CONTRIBUTING
+==============
+
+If you wish to contribute to KFTPGrabber, you should build it from SVN and
+contact the developers via e-mail or irc - the IRC channel is also a place
+where it's nice to be, since you can talk to other developers much easier.
+
+--------------------------------------------------------------------------------
+
+WWW : http://www.kftp.org/
+MAIL: kostko@unimatrix-one.org
+IRC : irc.freenode.net, #kftpgrabber
+
+--------------------------------------------------------------------------------
+
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..200adc7
--- /dev/null
+++ b/TODO
@@ -0,0 +1 @@
+See the provided "Roadmap" file.
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..ffda7a5
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,11920 @@
+## -*- 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"
+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
+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"
+done
+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>
+],
+[
+ char buf[42];
+ gzFile f = (gzFile) 0;
+ /* this would segfault.. but we only link, don't run */
+ (void) gzgets(f, buf, sizeof(buf));
+
+ return (zlibVersion() == ZLIB_VERSION);
+],
+ 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..dd92cb3
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,863 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 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.
+
+# 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.
+
+# Copyright (C) 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.
+
+# 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.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# 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
+# 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 7
+
+# 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])
+AC_SUBST([$1_FALSE])
+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
+# 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
+
+# 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], 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/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])
+])
+
+# 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /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
+# 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.58])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
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+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
+ 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
+])
+])
+
+
+# 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-"$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, 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_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
+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 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 whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# 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="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# 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/config.h.in b/config.h.in
new file mode 100644
index 0000000..b919289
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,363 @@
+/* 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 don't have `vprintf' but do have `_doprnt.' */
+#undef HAVE_DOPRNT
+
+/* Define to 1 if you have the `endpwent' function. */
+#undef HAVE_ENDPWENT
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define to 1 if you have the `gethostbyaddr' function. */
+#undef HAVE_GETHOSTBYADDR
+
+/* Define to 1 if you have the `gethostbyname' function. */
+#undef HAVE_GETHOSTBYNAME
+
+/* Define to 1 if you have the `getpass' function. */
+#undef HAVE_GETPASS
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have libjpeg */
+#undef HAVE_LIBJPEG
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+#undef HAVE_LIBNSL
+
+/* Define if you have libpng */
+#undef HAVE_LIBPNG
+
+/* Define if you have a working libpthread (will enable threaded code) */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the `resolv' library (-lresolv). */
+#undef HAVE_LIBRESOLV
+
+/* Define if you have libz */
+#undef HAVE_LIBZ
+
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
+ to 0 otherwise. */
+#undef HAVE_MALLOC
+
+/* Define to 1 if you have the `memmove' function. */
+#undef HAVE_MEMMOVE
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `memset' function. */
+#undef HAVE_MEMSET
+
+/* Define to 1 if you have the <netdb.h> header file. */
+#undef HAVE_NETDB_H
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define if your system needs _NSGetEnviron to set up the environment */
+#undef HAVE_NSGETENVIRON
+
+/* Define if you have OpenSSL < 0.9.6 */
+#undef HAVE_OLD_SSL_API
+
+/* Define to 1 if you have the <openssl/aes.h> header file. */
+#undef HAVE_OPENSSL_AES_H
+
+/* Define to 1 if you have the <openssl/blowfish.h> header file. */
+#undef HAVE_OPENSSL_BLOWFISH_H
+
+/* Define to 1 if you have the `poll' function. */
+#undef HAVE_POLL
+
+/* Define to 1 if your system has a GNU libc compatible `realloc' function,
+ and to 0 otherwise. */
+#undef HAVE_REALLOC
+
+/* Define if you have res_init */
+#undef HAVE_RES_INIT
+
+/* Define if you have the res_init prototype */
+#undef HAVE_RES_INIT_PROTO
+
+/* Define to 1 if you have the `select' function. */
+#undef HAVE_SELECT
+
+/* 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 `socket' function. */
+#undef HAVE_SOCKET
+
+/* If we are going to use OpenSSL */
+#undef HAVE_SSL
+
+/* 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 `strchr' function. */
+#undef HAVE_STRCHR
+
+/* Define to 1 if you have the `strdup' function. */
+#undef HAVE_STRDUP
+
+/* Define to 1 if you have the `strerror' function. */
+#undef HAVE_STRERROR
+
+/* 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 `strstr' function. */
+#undef HAVE_STRSTR
+
+/* 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/poll.h> header file. */
+#undef HAVE_SYS_POLL_H
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_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/time.h> header file. */
+#undef HAVE_SYS_TIME_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 <termios.h> header file. */
+#undef HAVE_TERMIOS_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vprintf' function. */
+#undef HAVE_VPRINTF
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the <zlib.h> header file. */
+#undef HAVE_ZLIB_H
+
+/* Suffix for lib directories */
+#undef KDELIBSUFF
+
+/* Define a safe value for MAXPATHLEN */
+#undef KDEMAXPATHLEN
+
+/* 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
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#undef RETSIGTYPE
+
+/* Define to the type of arg 1 for `select'. */
+#undef SELECT_TYPE_ARG1
+
+/* Define to the type of args 2, 3 and 4 for `select'. */
+#undef SELECT_TYPE_ARG234
+
+/* Define to the type of arg 5 for `select'. */
+#undef SELECT_TYPE_ARG5
+
+/* 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
+
+/* If we use arts volume */
+#undef USE_ARTS
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if compiling without arts */
+#undef WITHOUT_ARTS
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/*
+ * 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
+
+
+
+#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
+
+
+
+/*
+ * 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
+
+/* Define to rpl_malloc if the replacement function should be used. */
+#undef malloc
+
+/* Define to rpl_realloc if the replacement function should be used. */
+#undef realloc
diff --git a/configure.files b/configure.files
new file mode 100644
index 0000000..753790b
--- /dev/null
+++ b/configure.files
@@ -0,0 +1,4 @@
+./admin/configure.in.min
+configure.in.in
+./kftpgrabber/configure.in.in
+configure.in.bot
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..6b8ac3d
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,322 @@
+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(kftpgrabber-0.8.1, "3.5.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.2)
+AC_PATH_KDE
+dnl =======================================================
+dnl FILE: configure.in.in
+dnl =======================================================
+
+#MIN_CONFIG(3.2)
+CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS"
+
+if test "$build_arts" = "yes"; then
+ AC_DEFINE(USE_ARTS, 1, [If we use arts volume])
+ LIB_ARTS="-lartskde"
+ AC_SUBST(LIB_ARTS)
+fi
+
+KDE_INIT_DOXYGEN([KEG Network API Reference], [Version $VERSION])
+
+dnl =======================================================
+dnl FILE: ./kftpgrabber/configure.in.in
+dnl =======================================================
+
+#MIN_CONFIG(3.2.0)
+
+dnl PACKAGE set before
+
+dnl Check for the 3.4 kde version (for kdnssd)
+AC_DEFUN([CHECK_KDNSSD],
+[
+ AC_MSG_CHECKING(for KDNSSD support)
+ AC_CACHE_VAL(ac_cv_kdnssd,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ save_CXXFLAGS="$CXXFLAGS"
+
+ CXXFLAGS="$CXXFLAGS $all_includes"
+
+ AC_TRY_LINK([
+ #include <kdeversion.h>
+ ],
+ [
+ #if ! KDE_IS_VERSION(3,4,0)
+ KDE_choke me
+ #endif
+ ],
+ ac_cv_kdnssd=yes,
+ ac_cv_kdnssd=no
+ )
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])
+
+ if test "$ac_cv_kdnssd" = "yes"; then
+ AC_MSG_RESULT(yes)
+ LIB_KDNSSD="-lkdnssd"
+ else
+ AC_MSG_RESULT(no)
+ LIB_KDNSSD=""
+ fi
+
+ AC_SUBST(LIB_KDNSSD)
+])
+
+
+dnl Check for the correct kde version
+AC_DEFUN([CHECK_KDEVERSION],
+[
+ AC_MSG_CHECKING(for KDE >= 3.3)
+ AC_CACHE_VAL(ac_cv_kde33,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ save_CXXFLAGS="$CXXFLAGS"
+
+ CXXFLAGS="$CXXFLAGS $all_includes"
+
+ AC_TRY_LINK([
+ #include <kdeversion.h>
+ ],
+ [
+ #if ! KDE_IS_VERSION(3,3,0)
+ KDE_choke me
+ #endif
+ ],
+ ac_cv_kde33=yes,
+ ac_cv_kde33=no
+ )
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])
+
+ if test "$ac_cv_kde33" = "yes"; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+
+ echo ""
+ echo " * You don't have KDE 3.3 or later installed on your system."
+ echo " * KFTPGrabber requires at least KDE 3.3 or later."
+ echo ""
+ exit 1
+ fi
+])
+
+dnl Stuff required for libssh
+AC_CHECK_LIB([resolv],[gethostbyname])
+AC_CHECK_LIB([nsl],[gethostbyname])
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS([fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h \
+sys/time.h termios.h unistd.h openssl/aes.h openssl/blowfish.h zlib.h \
+sys/poll.h ])
+
+AC_FUNC_MALLOC
+AC_FUNC_MEMCMP
+AC_FUNC_REALLOC
+AC_FUNC_SELECT_ARGTYPES
+AC_TYPE_SIGNAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([endpwent gethostbyaddr gethostbyname getpass memmove memset \
+ select socket strchr strdup strerror strstr poll])
+
+dnl Check for some stuff
+KDE_CHECK_SSL
+CHECK_KDEVERSION
+CHECK_KDNSSD
+
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
+KDE_CREATE_SUBDIRSLIST
+AM_CONDITIONAL(kftpgrabber_SUBDIR_included, test "x$kftpgrabber_SUBDIR_included" = xyes)
+AM_CONDITIONAL(translations_SUBDIR_included, test "x$translations_SUBDIR_included" = xyes)
+AC_CONFIG_FILES([ Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/engine/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/customcommands/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/interfaces/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/libs/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/libs/ssh/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/plugins/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/plugins/bookmarkimport/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/plugins/bookmarkimport/gftp/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/plugins/bookmarkimport/kftp/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/ui/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/widgets/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/widgets/bookmarks/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/widgets/browser/Makefile ])
+AC_CONFIG_FILES([ kftpgrabber/src/widgets/queueview/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/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/fr/Makefile ])
+AC_CONFIG_FILES([ translations/fr/messages/Makefile ])
+AC_CONFIG_FILES([ translations/ga/Makefile ])
+AC_CONFIG_FILES([ translations/ga/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/nl/Makefile ])
+AC_CONFIG_FILES([ translations/nl/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/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/zh_CN/Makefile ])
+AC_CONFIG_FILES([ translations/zh_CN/messages/Makefile ])
+AC_OUTPUT
+dnl Put here things to be done at the very end - telling users
+dnl about additional packages to install. Better yet is giving
+dnl each project / subdr its own configure.in.bot.
+
+# 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..3b7eaa7
--- /dev/null
+++ b/configure.in.bot
@@ -0,0 +1,4 @@
+dnl Put here things to be done at the very end - telling users
+dnl about additional packages to install. Better yet is giving
+dnl each project / subdr its own configure.in.bot.
+
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000..a781b76
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,11 @@
+#MIN_CONFIG(3.2)
+CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS"
+
+if test "$build_arts" = "yes"; then
+ AC_DEFINE(USE_ARTS, 1, [If we use arts volume])
+ LIB_ARTS="-lartskde"
+ AC_SUBST(LIB_ARTS)
+fi
+
+KDE_INIT_DOXYGEN([KEG Network API Reference], [Version $VERSION])
+
diff --git a/kftpgrabber/COPYING-DOCS b/kftpgrabber/COPYING-DOCS
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/kftpgrabber/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/kftpgrabber/LICENSE.OpenSSL b/kftpgrabber/LICENSE.OpenSSL
new file mode 100644
index 0000000..4027788
--- /dev/null
+++ b/kftpgrabber/LICENSE.OpenSSL
@@ -0,0 +1,127 @@
+
+ LICENSE ISSUES
+ ==============
+
+ The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+ the OpenSSL License and the original SSLeay license apply to the toolkit.
+ See below for the actual license texts. Actually both licenses are BSD-style
+ Open Source licenses. In case of any license issues related to OpenSSL
+ please contact openssl-core@openssl.org.
+
+ OpenSSL License
+ ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved.
+ *
+ * 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.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED 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 OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS 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.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com). This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * 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 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.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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 OR CONTRIBUTORS 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.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
diff --git a/kftpgrabber/Makefile.am b/kftpgrabber/Makefile.am
new file mode 100644
index 0000000..35c85b3
--- /dev/null
+++ b/kftpgrabber/Makefile.am
@@ -0,0 +1,12 @@
+SUBDIRS = src
+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)/kftpgrabber.pot; \
+ fi
+ rm -f rc.cpp
+
+
diff --git a/kftpgrabber/NEWS b/kftpgrabber/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/kftpgrabber/NEWS
diff --git a/kftpgrabber/Roadmap b/kftpgrabber/Roadmap
new file mode 100644
index 0000000..5f6f0cf
--- /dev/null
+++ b/kftpgrabber/Roadmap
@@ -0,0 +1,33 @@
+PRIORITY
+**********************************************************
+- Fix slow SSL data connections in the new engine. - Kostko
+
+VERSION 0.8
+**********************************************************
+- Keep alive (NOOP). - someone
+
+- Drag drop changing position in queue. After server as top item have been done. - anyone(tobias if no one does it first).
+
+- Tooltips. - Tobias/first come.
+
+- Auto save queue on folder complete. (unless someone disagrees with this idea - tobias). - anybody.
+
+- Handle bookmark file conflicts properly. - ???.
+
+- Documentation (should be docbook, see http://quality.kde.org/develop/howto/howtodocs.php) for [priority, view/edit, FXP speed, and what else tobias didn't comment] - tobias(well.. DOH).
+
+- Unify all the filtering options (highlighting, priority lists, ASCII extensions) by creating a filtering API. A Thunderbird-like filtering dialog should be used for user configuration.
+
+UNDECIDED:
+**********************************************************
+- Kicker applet showing threads, and speed.(unless someone disagrees with this idea - tobias)
+
+- Split queue/logs (or rather.. any two(+) of the tabs).
+
+- Bookmark directories on server.
+
+- Mirror enter directories with alt+dbl click.. if directory names are similar in both panes.
+
+- Open an ssh window to the connected window.. and automagicly log in (how?.. i'm not sure i see the need)
+
+- Reconnect and do cd after disconnect (on timeout).
diff --git a/kftpgrabber/configure.in.in b/kftpgrabber/configure.in.in
new file mode 100644
index 0000000..f8aaff2
--- /dev/null
+++ b/kftpgrabber/configure.in.in
@@ -0,0 +1,110 @@
+#MIN_CONFIG(3.2.0)
+
+AM_INIT_AUTOMAKE(kftpgrabber, 0.8.0)
+
+dnl Check for the 3.4 kde version (for kdnssd)
+AC_DEFUN([CHECK_KDNSSD],
+[
+ AC_MSG_CHECKING(for KDNSSD support)
+ AC_CACHE_VAL(ac_cv_kdnssd,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ save_CXXFLAGS="$CXXFLAGS"
+
+ CXXFLAGS="$CXXFLAGS $all_includes"
+
+ AC_TRY_LINK([
+ #include <kdeversion.h>
+ ],
+ [
+ #if ! KDE_IS_VERSION(3,4,0)
+ KDE_choke me
+ #endif
+ ],
+ ac_cv_kdnssd=yes,
+ ac_cv_kdnssd=no
+ )
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])
+
+ if test "$ac_cv_kdnssd" = "yes"; then
+ AC_MSG_RESULT(yes)
+ LIB_KDNSSD="-lkdnssd"
+ else
+ AC_MSG_RESULT(no)
+ LIB_KDNSSD=""
+ fi
+
+ AC_SUBST(LIB_KDNSSD)
+])
+
+
+dnl Check for the correct kde version
+AC_DEFUN([CHECK_KDEVERSION],
+[
+ AC_MSG_CHECKING(for KDE >= 3.3)
+ AC_CACHE_VAL(ac_cv_kde33,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ save_CXXFLAGS="$CXXFLAGS"
+
+ CXXFLAGS="$CXXFLAGS $all_includes"
+
+ AC_TRY_LINK([
+ #include <kdeversion.h>
+ ],
+ [
+ #if ! KDE_IS_VERSION(3,3,0)
+ KDE_choke me
+ #endif
+ ],
+ ac_cv_kde33=yes,
+ ac_cv_kde33=no
+ )
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])
+
+ if test "$ac_cv_kde33" = "yes"; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+
+ echo ""
+ echo " * You don't have KDE 3.3 or later installed on your system."
+ echo " * KFTPGrabber requires at least KDE 3.3 or later."
+ echo ""
+ exit 1
+ fi
+])
+
+dnl Stuff required for libssh
+AC_CHECK_LIB([resolv],[gethostbyname])
+AC_CHECK_LIB([nsl],[gethostbyname])
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS([fcntl.h netdb.h netinet/in.h stdlib.h string.h sys/socket.h \
+sys/time.h termios.h unistd.h openssl/aes.h openssl/blowfish.h zlib.h \
+sys/poll.h ])
+
+AC_FUNC_MALLOC
+AC_FUNC_MEMCMP
+AC_FUNC_REALLOC
+AC_FUNC_SELECT_ARGTYPES
+AC_TYPE_SIGNAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([endpwent gethostbyaddr gethostbyname getpass memmove memset \
+ select socket strchr strdup strerror strstr poll])
+
+dnl Check for some stuff
+KDE_CHECK_SSL
+CHECK_KDEVERSION
+CHECK_KDNSSD
+
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
diff --git a/kftpgrabber/src/Makefile.am b/kftpgrabber/src/Makefile.am
new file mode 100644
index 0000000..9464ee5
--- /dev/null
+++ b/kftpgrabber/src/Makefile.am
@@ -0,0 +1,59 @@
+# set the include path for X, qt and KDE
+INCLUDES = -I$(srcdir)/misc \
+ -I$(srcdir)/ui -I./ui \
+ -I$(srcdir)/widgets \
+ -I$(srcdir)/widgets/browser \
+ -I$(srcdir)/widgets/filtereditor \
+ -I$(srcdir)/widgets/queueview \
+ $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = checksumverifier.h kftpbookmarks.h kftpqueue.h \
+ kftpbookmarks.h mainwindow.h kftpqueue.h mainactions.h kftpbookmarkaction.h \
+ kftpqueueprocessor.h kftpsession.h kftpqueueconverter.h kftptransfer.h \
+ kftptransferfile.h kftptransferdir.h kftpfileexistsactions.h \
+ statistics.h site.h queueobject.h queuegroup.h \
+ directoryscanner.h
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+KDE_ICON = kftpgrabber
+
+#########################################################################
+# APPLICATION SECTION
+#########################################################################
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = kftpgrabber
+
+# the application source, library search path, and link libraries
+kftpgrabber_SOURCES = main.cpp mainwindow.cpp checksumverifier.cpp \
+ kftpbookmarks.cpp kftpqueue.cpp mainactions.cpp kftpbookmarkaction.cpp \
+ kftpqueueprocessor.cpp kftpsession.cpp kftpqueueconverter.cpp kftptransfer.cpp \
+ kftptransferfile.cpp kftptransferdir.cpp \
+ kftpfileexistsactions.cpp statistics.cpp site.cpp queueobject.cpp \
+ queuegroup.cpp directoryscanner.cpp
+kftpgrabber_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+kftpgrabber_LDADD = \
+ widgets/bookmarks/libbookmarkwidgets.a \
+ widgets/browser/libbrowser.a \
+ widgets/queueview/libqueueviewwidget.a \
+ widgets/libwidgets.a \
+ engine/libengine.a \
+ misc/libkftpgrabbercore.a \
+ misc/customcommands/libcustomcommands.a \
+ ui/libui.a \
+ misc/interfaces/libkftpinterfaces.la \
+ misc/libs/ssh/libssh.a \
+ $(LIB_KDNSSD) -lkwalletclient $(LIBSSL) $(LIB_KPARTS) \
+ $(LIB_KIO) $(LIB_KDEUI)
+
+# this is where the desktop file will go
+xdg_apps_DATA = kftpgrabber.desktop
+
+# this is where the shell's XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/kftpgrabber
+shellrc_DATA = kftpgrabberui.rc kftpgrabber-logo.png kftpgrabber-bi-wizard.png
+
+SUBDIRS = misc engine ui widgets
diff --git a/kftpgrabber/src/checksumverifier.cpp b/kftpgrabber/src/checksumverifier.cpp
new file mode 100644
index 0000000..022e79c
--- /dev/null
+++ b/kftpgrabber/src/checksumverifier.cpp
@@ -0,0 +1,272 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "checksumverifier.h"
+
+#include <qfile.h>
+#include <qdir.h>
+#include <qapplication.h>
+
+#include <stdio.h>
+
+#include <kmdcodec.h>
+#include <kurl.h>
+
+namespace KFTPCore {
+
+ChecksumVerifierThread::ChecksumVerifierThread(ChecksumVerifier *verifier)
+ : QThread(),
+ m_verifier(verifier)
+{
+}
+
+void ChecksumVerifierThread::run()
+{
+ switch (m_verifier->m_type) {
+ case ChecksumVerifier::CheckMd5: break;
+ case ChecksumVerifier::CheckSfv: checkSFV(m_verifier->m_filename); break;
+ }
+}
+
+
+void ChecksumVerifierThread::checkSFV(const QString &sfvfile, const QString &fileToCheck)
+{
+ QString fileDir = KURL(sfvfile).directory(false);
+ QDir fileSystem;
+ QFile file(sfvfile);
+ if (!file.open(IO_ReadOnly)) {
+ // Dispatch the event that we have failed the verification
+ ChecksumVerifierThreadEvent *e = new ChecksumVerifierThreadEvent(2);
+ qApp->postEvent(m_verifier, e);
+ return;
+ }
+
+ QValueList<QPair<QString, QString> > fileList;
+ while (!file.atEnd()) {
+ QString line;
+ file.readLine(line, 1024);
+ line = line.simplifyWhiteSpace();
+
+ // Check if the line is a comment or a blank line (<3 chars)
+ if (line[0] == ';' || line.length() < 3)
+ continue;
+
+ // filename.r00 C46D96FF
+ QString fileName = line.section(' ', 0, 0);
+ QString checksum = line.section(' ', 1, 1);
+ checksum = checksum.lower();
+
+ if (checksum.length() != 8) {
+ // Dispatch the event that we have failed the verification
+ ChecksumVerifierThreadEvent *e = new ChecksumVerifierThreadEvent(2);
+ qApp->postEvent(m_verifier, e);
+ file.close();
+ return;
+ }
+
+ if (fileToCheck != QString::null && fileName != fileToCheck)
+ continue;
+
+ fileList.append(QPair<QString, QString>(fileName, checksum));
+ }
+ file.close();
+
+ // Dispatch the event that we have the list
+ ChecksumVerifierThreadEvent *e = new ChecksumVerifierThreadEvent(fileList);
+ qApp->postEvent(m_verifier, e);
+
+ // Check the obtained checksums
+ int done = 0;
+ for (QValueList<QPair<QString, QString> >::iterator i = fileList.begin(); i != fileList.end(); ++i) {
+ if (!fileSystem.exists(fileDir + (*i).first)) {
+ ChecksumVerifierThreadEvent *e = new ChecksumVerifierThreadEvent((*i).first, ChecksumVerifier::NotFound);
+ qApp->postEvent(m_verifier, e);
+
+ e = new ChecksumVerifierThreadEvent(3, (++done * 100) / fileList.count());
+ qApp->postEvent(m_verifier, e);
+ continue;
+ }
+
+ long l_fileCRC = getFileCRC(QString(fileDir + (*i).first).ascii());
+ QString fileCRC;
+ fileCRC.sprintf("%08lX", l_fileCRC);
+ fileCRC = fileCRC.lower();
+
+ ChecksumVerifierThreadEvent *e = new ChecksumVerifierThreadEvent((*i).first, fileCRC == (*i).second ? ChecksumVerifier::Ok : ChecksumVerifier::Error);
+ qApp->postEvent(m_verifier, e);
+
+ e = new ChecksumVerifierThreadEvent(3, (++done * 100) / fileList.count());
+ qApp->postEvent(m_verifier, e);
+ }
+}
+
+inline long ChecksumVerifierThread::UpdateCRC(register unsigned long CRC, register char *buffer, register long count)
+{
+ unsigned long CRCTABLE[] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+ };
+
+ if (buffer && count) {
+ do {
+ CRC =
+ ((CRC >> 8) & 0xFFFFFF) ^
+ CRCTABLE[(unsigned char)((CRC & 0xff) ^
+ *buffer++)];
+ }
+ while (--count);
+
+ }
+ return CRC;
+}
+
+long ChecksumVerifierThread::getFileCRC(const char *filename)
+{
+ register unsigned long crc = 0xffffffff;
+ FILE *f;
+ long totalread = 0;
+ long localread;
+
+ /*
+ * Note: different buffer sizes may result in noticable
+ * different performance depending on system, so feel
+ * free to modify.
+ */
+#define BUFFERSIZE 65536*16
+ char buffer[BUFFERSIZE];
+
+ if ((f = fopen(filename, "rb")) != NULL) {
+ do {
+ if ((localread = fread(buffer, 1, BUFFERSIZE, f))) {
+ crc = UpdateCRC(crc, buffer, localread);
+ totalread = totalread + localread;
+ }
+ }
+ while (localread > 0);
+ fclose(f);
+
+ crc = crc ^ 0xffffffff;
+ } else {
+ return -1;
+ }
+
+ return crc;
+#undef BUFFERSIZE
+}
+
+ChecksumVerifier::ChecksumVerifier(const QString &filename, Type type)
+ : QObject(),
+ m_filename(filename),
+ m_type(type),
+ m_thread(0)
+{
+}
+
+ChecksumVerifier::~ChecksumVerifier()
+{
+ if (m_thread) {
+ m_thread->terminate();
+ m_thread->wait();
+
+ delete m_thread;
+ }
+}
+
+void ChecksumVerifier::verify()
+{
+ m_thread = new ChecksumVerifierThread(this);
+ m_thread->start();
+}
+
+void ChecksumVerifier::customEvent(QCustomEvent *e)
+{
+ if (e->type() == CV_THR_EVENT_ID) {
+ ChecksumVerifierThreadEvent *ev = static_cast<ChecksumVerifierThreadEvent*>(e);
+
+ switch (ev->m_type) {
+ case 0: emit fileDone(ev->m_filename, ev->m_result); break;
+ case 1: emit fileList(ev->m_list); break;
+ case 2: emit error(); break;
+ case 3: emit progress(ev->m_progress); break;
+ }
+ }
+}
+
+}
+
+#include "checksumverifier.moc"
+
diff --git a/kftpgrabber/src/checksumverifier.h b/kftpgrabber/src/checksumverifier.h
new file mode 100644
index 0000000..c2a5e14
--- /dev/null
+++ b/kftpgrabber/src/checksumverifier.h
@@ -0,0 +1,136 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPCORE_CHECKSUMVERIFIER_H
+#define KFTPCORE_CHECKSUMVERIFIER_H
+
+#include <qstring.h>
+#include <qthread.h>
+#include <qobject.h>
+#include <qvaluelist.h>
+#include <qpair.h>
+
+namespace KFTPCore {
+
+class ChecksumVerifierThread;
+
+/**
+ * @author Jernej Kos
+ */
+class ChecksumVerifier : public QObject
+{
+friend class ChecksumVerifierThread;
+Q_OBJECT
+public:
+ enum Type {
+ CheckMd5,
+ CheckSfv
+ };
+
+ enum Result {
+ Ok,
+ NotFound,
+ Error
+ };
+
+ ChecksumVerifier(const QString &filename, Type type = CheckSfv);
+ ~ChecksumVerifier();
+
+ void verify();
+protected:
+ void customEvent(QCustomEvent *e);
+private:
+ QString m_filename;
+ Type m_type;
+
+ ChecksumVerifierThread *m_thread;
+signals:
+ void progress(int percent);
+ void fileDone(const QString &filename, KFTPCore::ChecksumVerifier::Result result);
+ void fileList(QValueList<QPair<QString, QString> > list);
+ void error();
+};
+
+#define CV_THR_EVENT_ID 65300
+
+class ChecksumVerifierThreadEvent : public QCustomEvent
+{
+friend class ChecksumVerifier;
+public:
+ ChecksumVerifierThreadEvent(const QString &filename, ChecksumVerifier::Result result)
+ : QCustomEvent((QEvent::Type) CV_THR_EVENT_ID),
+ m_type(0),
+ m_filename(filename),
+ m_result(result)
+ {}
+
+ ChecksumVerifierThreadEvent(QValueList<QPair<QString, QString> > list)
+ : QCustomEvent((QEvent::Type) CV_THR_EVENT_ID),
+ m_type(1),
+ m_list(list)
+ {}
+
+ ChecksumVerifierThreadEvent(int type, int progress = 0)
+ : QCustomEvent((QEvent::Type) CV_THR_EVENT_ID),
+ m_type(type),
+ m_progress(progress)
+ {}
+private:
+ int m_type;
+ int m_progress;
+ QString m_filename;
+ ChecksumVerifier::Result m_result;
+ QValueList<QPair<QString, QString> > m_list;
+};
+
+class ChecksumVerifierThread : public QThread
+{
+public:
+ ChecksumVerifierThread(ChecksumVerifier *verifier);
+protected:
+ void run();
+private:
+ ChecksumVerifier *m_verifier;
+
+ void checkSFV(const QString &sfvfile, const QString &fileToCheck = QString::null);
+
+ static inline long UpdateCRC(register unsigned long CRC, register char *buffer, register long count);
+ static long getFileCRC(const char *filename);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/directoryscanner.cpp b/kftpgrabber/src/directoryscanner.cpp
new file mode 100644
index 0000000..5adaf45
--- /dev/null
+++ b/kftpgrabber/src/directoryscanner.cpp
@@ -0,0 +1,178 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "directoryscanner.h"
+#include "kftpqueue.h"
+
+#include "misc/config.h"
+#include "misc/filter.h"
+
+#include <kfileitem.h>
+
+#include <qapplication.h>
+#include <qdir.h>
+
+using namespace KFTPQueue;
+using namespace KFTPCore::Filter;
+using namespace KFTPEngine;
+
+DirectoryScanner::DirectoryScanner(Transfer *transfer)
+{
+ // Lock the transfer
+ transfer->lock();
+
+ // Construct a new thread and run it
+ ScannerThread *thread = new ScannerThread(this, transfer);
+ thread->start();
+}
+
+void DirectoryScanner::customEvent(QCustomEvent *e)
+{
+ if (e->type() == QS_THR_EVENT_ID) {
+ KFTPQueue::Transfer *transfer = static_cast<KFTPQueue::Transfer*>(e->data());
+ transfer->unlock();
+ emit completed();
+
+ // Destroy thiy object
+ delete this;
+ }
+}
+
+DirectoryScanner::ScannerThread::ScannerThread(QObject *parent, Transfer *item)
+ : QThread(),
+ m_parent(parent),
+ m_item(item)
+{
+}
+
+void DirectoryScanner::ScannerThread::run()
+{
+ // First scan the folder
+ scanFolder(m_item);
+
+ // We are done, post event to notify the GUI
+ ScannerThreadEvent *e = new ScannerThreadEvent(m_item);
+ qApp->postEvent(m_parent, e);
+}
+
+void DirectoryScanner::ScannerThread::scanFolder(Transfer *parent)
+{
+ QDir fs(parent->getSourceUrl().path());
+ fs.setFilter(QDir::Readable | QDir::Hidden | QDir::All);
+
+ const QFileInfoList *p_list = fs.entryInfoList();
+ QFileInfoListIterator i(*p_list);
+ QFileInfo *file;
+
+ QValueList<DirectoryEntry> list;
+
+ while ((file = i.current()) != 0) {
+ ++i;
+
+ if (file->fileName() == "." || file->fileName() == "..")
+ continue;
+
+ KURL sourceUrl;
+ sourceUrl.setPath(file->absFilePath());
+
+ // This is needed, since QFileInfo works with uint for the filesize
+ filesize_t realSize = KFileItem(KFileItem::Unknown, KFileItem::Unknown, sourceUrl, true).size();
+
+ // Check if we should skip this entry
+ const ActionChain *actionChain = Filters::self()->process(sourceUrl, realSize, file->isDir());
+
+ if (actionChain && actionChain->getAction(Action::Skip))
+ continue;
+
+ DirectoryEntry entry;
+ entry.setFilename(file->fileName());
+ entry.setType(file->isDir() ? 'd' : 'f');
+ entry.setSize(realSize);
+
+ list.append(entry);
+ }
+
+ // Sort by priority
+ qHeapSort(list);
+
+ QValueList<DirectoryEntry>::ConstIterator listEnd = list.end();
+ for (QValueList<DirectoryEntry>::ConstIterator j = list.begin(); j != listEnd; ++j) {
+ // Spawn transfer
+ KURL destUrlBase = parent->getDestUrl();
+ KURL sourceUrlBase = parent->getSourceUrl();
+
+ destUrlBase.addPath((*j).filename());
+ sourceUrlBase.addPath((*j).filename());
+
+ if ((*j).isDirectory()) {
+ // Directory
+ qApp->lock();
+ KFTPQueue::TransferDir *transfer = new KFTPQueue::TransferDir(parent);
+ transfer->setSourceUrl(sourceUrlBase);
+ transfer->setDestUrl(destUrlBase);
+ transfer->addSize((*j).size());
+ transfer->setTransferType(parent->getTransferType());
+ transfer->setId(KFTPQueue::Manager::self()->nextTransferId());
+
+ emit KFTPQueue::Manager::self()->newTransfer(transfer);
+ qApp->unlock();
+
+ // Call this function in recursion
+ scanFolder(transfer);
+
+ if (KFTPCore::Config::skipEmptyDirs() && !transfer->hasChildren()) {
+ qApp->lock();
+ KFTPQueue::Manager::self()->removeTransfer(transfer, false);
+ qApp->unlock();
+ }
+ } else {
+ // File
+ qApp->lock();
+ KFTPQueue::TransferFile *transfer = new KFTPQueue::TransferFile(parent);
+ transfer->setSourceUrl(sourceUrlBase);
+ transfer->setDestUrl(destUrlBase);
+ transfer->addSize((*j).size());
+ transfer->setTransferType(parent->getTransferType());
+ transfer->setId(KFTPQueue::Manager::self()->nextTransferId());
+
+ emit KFTPQueue::Manager::self()->newTransfer(transfer);
+ qApp->unlock();
+ }
+ }
+}
+
+#include "directoryscanner.moc"
+
+
diff --git a/kftpgrabber/src/directoryscanner.h b/kftpgrabber/src/directoryscanner.h
new file mode 100644
index 0000000..68e05d0
--- /dev/null
+++ b/kftpgrabber/src/directoryscanner.h
@@ -0,0 +1,106 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef DIRECTORYSCANNER_H
+#define DIRECTORYSCANNER_H
+
+#define QS_THR_EVENT_ID 65200
+
+#include <qobject.h>
+#include <qthread.h>
+
+namespace KFTPQueue {
+ class Transfer;
+ class Manager;
+}
+
+/**
+ * This class can be used to scan a local directory using a separate
+ * thread and create any needed child transfers.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class DirectoryScanner : public QObject {
+Q_OBJECT
+friend class KFTPQueue::Manager;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param transfer The transfer to scan
+ */
+ DirectoryScanner(KFTPQueue::Transfer *transfer);
+protected:
+ void customEvent(QCustomEvent *e);
+private:
+ /**
+ * An event posted by the scanner thread.
+ */
+ class ScannerThreadEvent : public QCustomEvent
+ {
+ public:
+ ScannerThreadEvent(void *data)
+ : QCustomEvent((QEvent::Type) QS_THR_EVENT_ID, data) {}
+ };
+
+ /**
+ * The actual thread that does the scanning.
+ */
+ class ScannerThread : public QThread {
+ public:
+ ScannerThread(QObject *parent, KFTPQueue::Transfer *item);
+ protected:
+ /**
+ * Thread entry point.
+ */
+ void run();
+ private:
+ QObject *m_parent;
+ KFTPQueue::Transfer *m_item;
+
+ /**
+ * A method to recursively scan a given folder.
+ */
+ void scanFolder(KFTPQueue::Transfer *parent);
+ };
+signals:
+ /**
+ * This signal is emitted when scanning complets. This object is automaticly
+ * destroyed immediately after the signal returns!
+ */
+ void completed();
+};
+
+#endif
diff --git a/kftpgrabber/src/engine/Makefile.am b/kftpgrabber/src/engine/Makefile.am
new file mode 100644
index 0000000..ad6adb1
--- /dev/null
+++ b/kftpgrabber/src/engine/Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES = -I.. -I$(srcdir)/.. \
+ -I../misc -I$(srcdir)/../misc \
+ $(all_includes)
+METASOURCES = AUTO
+noinst_LIBRARIES = libengine.a
+noinst_HEADERS = socket.h thread.h directorylisting.h commands.h event.h \
+ ftpsocket.h ftpdirectoryparser.h cache.h sftpsocket.h connectionretry.h \
+ speedlimiter.h ssl.h
+libengine_a_SOURCES = socket.cpp thread.cpp directorylisting.cpp commands.cpp \
+ event.cpp ftpsocket.cpp ftpdirectoryparser.cpp cache.cpp sftpsocket.cpp \
+ connectionretry.cpp speedlimiter.cpp ssl.cpp
diff --git a/kftpgrabber/src/engine/cache.cpp b/kftpgrabber/src/engine/cache.cpp
new file mode 100644
index 0000000..1b28dd6
--- /dev/null
+++ b/kftpgrabber/src/engine/cache.cpp
@@ -0,0 +1,175 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "cache.h"
+#include "socket.h"
+
+#include <kstaticdeleter.h>
+
+namespace KFTPEngine {
+
+Cache *Cache::m_self = 0;
+static KStaticDeleter<Cache> staticCacheDeleter;
+
+Cache *Cache::self()
+{
+ if (!m_self) {
+ staticCacheDeleter.setObject(m_self, new Cache());
+ }
+
+ return m_self;
+}
+
+Cache::Cache()
+{
+}
+
+Cache::~Cache()
+{
+ if (m_self == this)
+ staticCacheDeleter.setObject(m_self, 0, false);
+}
+
+void Cache::addDirectory(KURL &url, DirectoryListing listing)
+{
+ url.adjustPath(-1);
+ m_listingCache[url] = listing;
+}
+
+void Cache::addDirectory(Socket *socket, DirectoryListing listing)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(socket->getCurrentDirectory());
+
+ addDirectory(url, listing);
+}
+
+void Cache::updateDirectoryEntry(Socket *socket, KURL &path, filesize_t filesize)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(path.directory());
+ url.adjustPath(-1);
+
+ if (m_listingCache.contains(url)) {
+ DirectoryListing listing = m_listingCache[url];
+ listing.updateEntry(path.fileName(), filesize);
+
+ m_listingCache.replace(url, listing);
+ }
+}
+
+void Cache::addPath(KURL &url, const QString &target)
+{
+ url.adjustPath(-1);
+ m_pathCache[url] = target;
+}
+
+void Cache::addPath(Socket *socket, const QString &target)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(socket->getCurrentDirectory());
+
+ addPath(url, target);
+}
+
+void Cache::invalidateEntry(KURL &url)
+{
+ url.adjustPath(-1);
+ m_listingCache.remove(url);
+}
+
+void Cache::invalidateEntry(Socket *socket, const QString &path)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(path);
+
+ invalidateEntry(url);
+}
+
+void Cache::invalidatePath(KURL &url)
+{
+ url.adjustPath(-1);
+ m_pathCache.remove(url);
+}
+
+void Cache::invalidatePath(Socket *socket, const QString &path)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(path);
+
+ invalidatePath(url);
+}
+
+DirectoryListing Cache::findCached(KURL &url)
+{
+ url.adjustPath(-1);
+
+ if (m_listingCache.contains(url))
+ return m_listingCache[url];
+
+ DirectoryListing invalid;
+ invalid.setValid(false);
+
+ return invalid;
+}
+
+DirectoryListing Cache::findCached(Socket *socket, const QString &path)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(path);
+
+ return findCached(url);
+}
+
+QString Cache::findCachedPath(KURL &url)
+{
+ url.adjustPath(-1);
+
+ if (m_pathCache.contains(url))
+ return m_pathCache[url];
+
+ return QString::null;
+}
+
+QString Cache::findCachedPath(Socket *socket, const QString &path)
+{
+ KURL url = socket->getCurrentUrl();
+ url.setPath(path);
+
+ return findCachedPath(url);
+}
+
+}
diff --git a/kftpgrabber/src/engine/cache.h b/kftpgrabber/src/engine/cache.h
new file mode 100644
index 0000000..7b6cf21
--- /dev/null
+++ b/kftpgrabber/src/engine/cache.h
@@ -0,0 +1,176 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPENGINECACHE_H
+#define KFTPENGINECACHE_H
+
+#include <qmap.h>
+#include <kurl.h>
+
+#include "directorylisting.h"
+
+namespace KFTPEngine {
+
+class Socket;
+
+/**
+ * This class provides a cache of paths and directory listings to be used for
+ * faster operations.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class Cache {
+public:
+ static Cache *self();
+ ~Cache();
+
+ /**
+ * Cache a directory listing.
+ *
+ * @param url The listing url (including host information)
+ * @param listing The directory listing to cache
+ */
+ void addDirectory(KURL &url, DirectoryListing listing);
+
+ /**
+ * Cache a directory listing, extracting the host information from the
+ * socket and using the current directory path.
+ *
+ * @param socket The socket to extract the host info from
+ * @param listing The directory listing to cache
+ */
+ void addDirectory(Socket *socket, DirectoryListing listing);
+
+ /**
+ * Updates a single directory entry.
+ *
+ * @param socket The socket to extract the host info from
+ * @param path Entry location
+ * @param filesize New file size
+ */
+ void updateDirectoryEntry(Socket *socket, KURL &path, filesize_t filesize);
+
+ /**
+ * Cache path information.
+ *
+ * @param url The url (including host information)
+ * @param target Actual target directory
+ */
+ void addPath(KURL &url, const QString &target);
+
+ /**
+ * Cache path information, extracting the host information from the
+ * socket and using the current directory path.
+ *
+ * @param socket The socket to extract the host info from
+ * @param target Actual target directory
+ */
+ void addPath(Socket *socket, const QString &target);
+
+ /**
+ * Invalidate a cached entry.
+ *
+ * @param url Url of the entry
+ */
+ void invalidateEntry(KURL &url);
+
+ /**
+ * Invalidate a cached entry.
+ *
+ * @param socket The socket to extract the host info from
+ * @param path Path of the entry
+ */
+ void invalidateEntry(Socket *socket, const QString &path);
+
+ /**
+ * Invalidate a cached path.
+ *
+ * @param url Url of the entry
+ */
+ void invalidatePath(KURL &url);
+
+ /**
+ * Invalidate a cached path.
+ *
+ * @param socket The socket to extract the host info from
+ * @param path Path of the entry
+ */
+ void invalidatePath(Socket *socket, const QString &path);
+
+ /**
+ * Retrieve a cached directory listing.
+ *
+ * @param url Url of the entry
+ * @return A valid DirectoryListing if found, an empty DirectoryListing otherwise
+ */
+ DirectoryListing findCached(KURL &url);
+
+ /**
+ * Retrieve a cached directory listing.
+ *
+ * @param socket The socket to extract the host info from
+ * @param path Path of the entry
+ * @return A valid DirectoryListing if found, an empty DirectoryListing otherwise
+ */
+ DirectoryListing findCached(Socket *socket, const QString &path);
+
+ /**
+ * Retrieve a cached path.
+ *
+ * @param url Url of the entry
+ * @return A target path if found, QString::null otherwise
+ */
+ QString findCachedPath(KURL &url);
+
+ /**
+ * Retrieve a cached path.
+ *
+ * @param socket The socket to extract the host info from
+ * @param path Path of the entry
+ * @return A target path if found, QString::null otherwise
+ */
+ QString findCachedPath(Socket *socket, const QString &path);
+protected:
+ Cache();
+ static Cache *m_self;
+private:
+ QMap<KURL, DirectoryListing> m_listingCache;
+ QMap<KURL, QString> m_pathCache;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/commands.cpp b/kftpgrabber/src/engine/commands.cpp
new file mode 100644
index 0000000..5e0569f
--- /dev/null
+++ b/kftpgrabber/src/engine/commands.cpp
@@ -0,0 +1,78 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "commands.h"
+
+namespace KFTPEngine {
+
+namespace Commands {
+
+Base::Base(Socket *socket, Type command)
+ : m_command(command),
+ m_socket(socket),
+ m_wakeupEvent(0),
+ m_processing(false),
+ m_autoDestruct(false),
+ m_clean(false)
+{
+}
+
+void Base::setProcessing(bool value)
+{
+ if (value)
+ m_processing++;
+ else
+ m_processing--;
+}
+
+void Base::autoDestruct(ResetCode code)
+{
+ m_autoDestruct = true;
+ m_resetCode = code;
+}
+
+void Base::wakeup(WakeupEvent *event)
+{
+ // The default implementation just calls process()
+ m_wakeupEvent = event;
+ process();
+ m_wakeupEvent = 0;
+}
+
+}
+
+}
+
diff --git a/kftpgrabber/src/engine/commands.h b/kftpgrabber/src/engine/commands.h
new file mode 100644
index 0000000..679c673
--- /dev/null
+++ b/kftpgrabber/src/engine/commands.h
@@ -0,0 +1,136 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef COMMANDS_H
+#define COMMANDS_H
+
+#include "event.h"
+
+#define ENGINE_STANDARD_COMMAND_CONSTRUCTOR(class, type, cmd) public: \
+ class(type *socket) : Commands::Base(socket, Commands::cmd), currentState(None) {} \
+ private: \
+ State currentState; \
+ \
+ type *socket() {\
+ return static_cast<type*>(m_socket);\
+ }\
+ public:
+
+#define ENGINE_CANCELLATION_POINT { if (isDestructable()) \
+ return; }
+
+#define setupCommandClass(class) if (m_cmdData) \
+ delete m_cmdData; \
+ m_cmdData = new class(this);
+
+#define chainCommandClass(class) Commands::Base *_cmd = new class(socket()); \
+ socket()->addToCommandChain(_cmd); \
+ socket()->nextCommand(); \
+ return;
+
+#define activateCommandClass(class) if (m_cmdData) { \
+ Commands::Base *_cmd = new class(this); \
+ addToCommandChain(_cmd); \
+ nextCommand(); \
+ } else { \
+ m_cmdData = new class(this); \
+ m_cmdData->process(); \
+ }
+
+namespace KFTPEngine {
+
+class Socket;
+
+namespace Commands {
+
+enum Type {
+ CmdNone,
+ CmdNext,
+
+ // Actual commands
+ CmdConnect,
+ CmdConnectRetry,
+ CmdDisconnect,
+ CmdList,
+ CmdScan,
+ CmdGet,
+ CmdPut,
+ CmdDelete,
+ CmdRename,
+ CmdMkdir,
+ CmdChmod,
+ CmdRaw,
+ CmdFxp,
+ CmdKeepAlive
+};
+
+class Base {
+public:
+ Base(Socket *socket, Type type);
+
+ void setProcessing(bool value);
+ bool isProcessing() { return m_processing > 0; }
+
+ void autoDestruct(ResetCode code);
+ bool isDestructable() { return m_autoDestruct && !isProcessing(); }
+ ResetCode resetCode() { return m_resetCode; }
+
+ bool isClean() { return m_clean; }
+
+ Type command() { return m_command; }
+
+ bool isWakeup() { return m_wakeupEvent != 0; }
+ virtual void wakeup(WakeupEvent *event);
+ virtual void process() = 0;
+ virtual void cleanup() {}
+protected:
+ void markClean() { m_clean = true; }
+protected:
+ Type m_command;
+ Socket *m_socket;
+ WakeupEvent *m_wakeupEvent;
+
+ int m_processing;
+ bool m_autoDestruct;
+ ResetCode m_resetCode;
+ bool m_clean;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/connectionretry.cpp b/kftpgrabber/src/engine/connectionretry.cpp
new file mode 100644
index 0000000..e93a1b9
--- /dev/null
+++ b/kftpgrabber/src/engine/connectionretry.cpp
@@ -0,0 +1,112 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "connectionretry.h"
+#include "socket.h"
+#include "thread.h"
+#include "event.h"
+
+#include <klocale.h>
+
+namespace KFTPEngine {
+
+ConnectionRetry::ConnectionRetry(Socket *socket)
+ : QObject(),
+ m_socket(socket),
+ m_delay(socket->getConfigInt("retry_delay")),
+ m_max(socket->getConfigInt("max_retries")),
+ m_iteration(0)
+{
+ m_timer = new QTimer(this);
+
+ connect(m_timer, SIGNAL(timeout()), this, SLOT(slotShouldRetry()));
+ connect(m_socket->thread()->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+}
+
+void ConnectionRetry::startRetry()
+{
+ if ((m_iteration++ >= m_max && m_max != 0) || m_delay < 1) {
+ abortRetry();
+ return;
+ }
+
+ m_socket->setCurrentCommand(Commands::CmdConnectRetry);
+ m_socket->emitEvent(Event::EventMessage, i18n("Waiting %1 seconds before reconnect...").arg(m_delay));
+ m_socket->emitEvent(Event::EventState, i18n("Waiting..."));
+
+ m_timer->start(1000 * m_delay, true);
+}
+
+void ConnectionRetry::slotShouldRetry()
+{
+ m_socket->setCurrentCommand(Commands::CmdNone);
+ if (m_max > 0)
+ m_socket->emitEvent(Event::EventMessage, i18n("Retrying connection (%1/%2)...").arg(m_iteration).arg(m_max));
+ else
+ m_socket->emitEvent(Event::EventMessage, i18n("Retrying connection...").arg(m_iteration).arg(m_max));
+
+ // Reconnect
+ Thread *thread = m_socket->thread();
+ thread->connect(m_socket->getCurrentUrl());
+}
+
+void ConnectionRetry::abortRetry()
+{
+ m_timer->stop();
+
+ // Disable retry so we avoid infinite loops
+ m_socket->setConfig("retry", 0);
+
+ m_socket->setCurrentCommand(Commands::CmdNone);
+ m_socket->emitEvent(Event::EventMessage, i18n("Retry aborted."));
+ m_socket->emitEvent(Event::EventState, i18n("Idle."));
+ m_socket->emitEvent(Event::EventReady);
+ m_socket->emitError(ConnectFailed);
+
+ // This object should be automagicly removed
+ QObject::deleteLater();
+}
+
+void ConnectionRetry::slotEngineEvent(KFTPEngine::Event *event)
+{
+ if (event->type() == Event::EventConnect) {
+ m_socket->emitEvent(Event::EventRetrySuccess);
+
+ // This object should be automagicly removed
+ QObject::deleteLater();
+ }
+}
+
+}
diff --git a/kftpgrabber/src/engine/connectionretry.h b/kftpgrabber/src/engine/connectionretry.h
new file mode 100644
index 0000000..59a351d
--- /dev/null
+++ b/kftpgrabber/src/engine/connectionretry.h
@@ -0,0 +1,86 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPENGINECONNECTIONRETRY_H
+#define KFTPENGINECONNECTIONRETRY_H
+
+#include <qobject.h>
+#include <qtimer.h>
+
+namespace KFTPEngine {
+
+class Socket;
+class Event;
+
+/**
+ * This class will retry to reconnect to the currently set URL for the
+ * socket specified in constructor.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class ConnectionRetry : public QObject
+{
+Q_OBJECT
+public:
+ /**
+ * Constructs a new ConnectionRetry class instance.
+ */
+ ConnectionRetry(Socket *socket);
+
+ /**
+ * Start the reconnect cycle.
+ */
+ void startRetry();
+
+ /**
+ * Abort the running reconnect cycle and schedule this object's
+ * destruction.
+ */
+ void abortRetry();
+private:
+ Socket *m_socket;
+ int m_delay;
+ int m_max;
+ int m_iteration;
+
+ QTimer *m_timer;
+private slots:
+ void slotShouldRetry();
+ void slotEngineEvent(KFTPEngine::Event *event);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/directorylisting.cpp b/kftpgrabber/src/engine/directorylisting.cpp
new file mode 100644
index 0000000..1647bb2
--- /dev/null
+++ b/kftpgrabber/src/engine/directorylisting.cpp
@@ -0,0 +1,188 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "directorylisting.h"
+#include "misc/filter.h"
+
+#include <qdatetime.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kmimetype.h>
+
+#include <sys/stat.h>
+
+using namespace KFTPCore::Filter;
+using namespace KIO;
+
+namespace KFTPEngine {
+
+DirectoryEntry::DirectoryEntry()
+{
+}
+
+KIO::UDSEntry DirectoryEntry::toUdsEntry() const
+{
+ bool directory = m_type == 'd';
+ UDSAtom atom;
+ UDSEntry entry;
+
+ atom.m_uds = UDS_NAME;
+ atom.m_str = m_filename;
+ entry.append(atom);
+
+ atom.m_uds = UDS_SIZE;
+ atom.m_long = m_size;
+ entry.append(atom);
+
+ atom.m_uds = UDS_MODIFICATION_TIME;
+ atom.m_long = m_time;
+ entry.append(atom);
+
+ atom.m_uds = UDS_USER;
+ atom.m_str = m_owner;
+ entry.append(atom);
+
+ atom.m_uds = UDS_GROUP;
+ atom.m_str = m_group;
+ entry.append(atom);
+
+ atom.m_uds = UDS_ACCESS;
+ atom.m_long = m_permissions;
+ entry.append(atom);
+
+ if (!m_link.isEmpty()) {
+ atom.m_uds = UDS_LINK_DEST;
+ atom.m_str = m_link;
+ entry.append(atom);
+
+ KMimeType::Ptr mime = KMimeType::findByURL(KURL("ftp://host/" + m_filename));
+ if (mime->name() == KMimeType::defaultMimeType()) {
+ atom.m_uds = UDS_GUESSED_MIME_TYPE;
+ atom.m_str = "inode/directory";
+ entry.append(atom);
+
+ directory = true;
+ }
+ }
+
+ atom.m_uds = UDS_FILE_TYPE;
+ atom.m_long = directory ? S_IFDIR : S_IFREG;
+ entry.append(atom);
+
+ return entry;
+}
+
+QString DirectoryEntry::timeAsString()
+{
+ QDateTime dt;
+ dt.setTime_t(time());
+
+ return KGlobal::locale()->formatDateTime(dt);
+}
+
+bool DirectoryEntry::operator<(const DirectoryEntry &entry) const
+{
+ const Action *firstAction = Filters::self()->process(*this, Action::Priority);
+ const Action *secondAction = Filters::self()->process(entry, Action::Priority);
+
+ int priorityFirst = firstAction ? firstAction->value().toInt() : 0;
+ int prioritySecond = secondAction ? secondAction->value().toInt() : 0;
+
+ if (priorityFirst == prioritySecond) {
+ if (isDirectory() != entry.isDirectory())
+ return isDirectory();
+
+ return m_filename < entry.m_filename;
+ }
+
+ return priorityFirst > prioritySecond;
+}
+
+DirectoryTree::DirectoryTree(DirectoryEntry entry)
+ : m_entry(entry)
+{
+ m_directories.setAutoDelete(true);
+}
+
+void DirectoryTree::addFile(DirectoryEntry entry)
+{
+ m_files.append(entry);
+}
+
+DirectoryTree *DirectoryTree::addDirectory(DirectoryEntry entry)
+{
+ DirectoryTree *tree = new DirectoryTree(entry);
+ m_directories.append(tree);
+
+ return tree;
+}
+
+DirectoryListing::DirectoryListing(const KURL &path)
+ : m_valid(true),
+ m_path(path)
+{
+}
+
+DirectoryListing::~DirectoryListing()
+{
+ m_list.clear();
+}
+
+void DirectoryListing::addEntry(DirectoryEntry entry)
+{
+ m_list.append(entry);
+}
+
+void DirectoryListing::updateEntry(const QString &filename, ::filesize_t size)
+{
+ QValueList<DirectoryEntry>::iterator listEnd = m_list.end();
+ for (QValueList<DirectoryEntry>::iterator i = m_list.begin(); i != listEnd; i++) {
+ if ((*i).filename() == filename) {
+ (*i).setSize(size);
+ return;
+ }
+ }
+
+ // Entry not found, add one
+ DirectoryEntry entry;
+ entry.setFilename(filename);
+ entry.setSize(size);
+
+ addEntry(entry);
+}
+
+}
diff --git a/kftpgrabber/src/engine/directorylisting.h b/kftpgrabber/src/engine/directorylisting.h
new file mode 100644
index 0000000..b332d37
--- /dev/null
+++ b/kftpgrabber/src/engine/directorylisting.h
@@ -0,0 +1,141 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPNETWORKDIRECTORYLISTING_H
+#define KFTPNETWORKDIRECTORYLISTING_H
+
+#include <kio/global.h>
+#include <kurl.h>
+
+#include <qvaluelist.h>
+#include <qptrlist.h>
+
+#include <time.h>
+#include <sys/time.h>
+
+typedef unsigned long long int filesize_t;
+
+namespace KFTPEngine {
+
+class DirectoryEntry {
+public:
+ DirectoryEntry();
+
+ void setFilename(const QString &filename) { m_filename = filename; }
+ void setOwner(const QString &owner) { m_owner = owner; }
+ void setGroup(const QString &group) { m_group = group; }
+ void setLink(const QString &link) { m_link = link; }
+ void setPermissions(int permissions) { m_permissions = permissions; }
+ void setSize(filesize_t size) { m_size = size; }
+ void setType(char type) { m_type = type; }
+ void setTime(time_t time) { m_time = time; }
+
+ QString filename() const { return m_filename; }
+ QString owner() const { return m_owner; }
+ QString group() const { return m_group; }
+ QString link() const { return m_link; }
+ int permissions() const { return m_permissions; }
+ filesize_t size() const { return m_size; }
+ char type() const { return m_type; }
+ time_t time() const { return m_time; }
+ QString timeAsString();
+
+ bool isDirectory() const { return m_type == 'd'; }
+ bool isFile() const { return m_type == 'f'; }
+ bool isDevice() const { return m_type == 'c' || m_type == 'b'; }
+ bool isSymlink() const { return !m_link.isEmpty(); }
+
+ KIO::UDSEntry toUdsEntry() const;
+
+ struct tm timeStruct;
+
+ bool operator<(const DirectoryEntry &entry) const;
+private:
+ QString m_filename;
+ QString m_owner;
+ QString m_group;
+ QString m_link;
+
+ int m_permissions;
+ filesize_t m_size;
+ char m_type;
+ time_t m_time;
+};
+
+class DirectoryTree {
+public:
+ typedef QValueList<DirectoryEntry>::ConstIterator FileIterator;
+ typedef QPtrList<DirectoryTree>::ConstIterator DirIterator;
+
+ DirectoryTree() {}
+ DirectoryTree(DirectoryEntry entry);
+
+ void addFile(DirectoryEntry entry);
+ DirectoryTree *addDirectory(DirectoryEntry entry);
+
+ DirectoryEntry info() { return m_entry; }
+
+ QValueList<DirectoryEntry> *files() { return &m_files; }
+ QPtrList<DirectoryTree> *directories() { return &m_directories; }
+private:
+ DirectoryEntry m_entry;
+ QValueList<DirectoryEntry> m_files;
+ QPtrList<DirectoryTree> m_directories;
+};
+
+/**
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class DirectoryListing {
+public:
+ DirectoryListing(const KURL &path = KURL());
+ ~DirectoryListing();
+
+ void addEntry(DirectoryEntry entry);
+ void updateEntry(const QString &filename, filesize_t size);
+ QValueList<DirectoryEntry> list() { return m_list; }
+
+ void setValid(bool value) { m_valid = value; }
+ bool isValid() { return m_valid; }
+private:
+ bool m_valid;
+ KURL m_path;
+ QValueList<DirectoryEntry> m_list;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/event.cpp b/kftpgrabber/src/engine/event.cpp
new file mode 100644
index 0000000..bfbf6f6
--- /dev/null
+++ b/kftpgrabber/src/engine/event.cpp
@@ -0,0 +1,166 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "event.h"
+#include "thread.h"
+
+namespace KFTPEngine {
+
+EventParameter::EventParameter()
+{
+}
+
+EventParameter::EventParameter(const QString &string)
+{
+ m_type = ParamString;
+ m_string = string;
+}
+
+EventParameter::EventParameter(const KURL &url)
+{
+ m_type = ParamUrl;
+ m_url = url;
+}
+
+EventParameter::EventParameter(DirectoryListing listing)
+{
+ m_type = ParamDirListing;
+ m_directoryListing = listing;
+}
+
+EventParameter::EventParameter(DirectoryTree tree)
+{
+ m_type = ParamDirTree;
+ m_directoryTree = tree;
+}
+
+EventParameter::EventParameter(ErrorCode error)
+{
+ m_type = ParamErrorCode;
+ m_errorCode = error;
+}
+
+EventParameter::EventParameter(filesize_t size)
+{
+ m_type = ParamSize;
+ m_fileSize = size;
+}
+
+EventParameter::EventParameter(void *data)
+{
+ m_type = ParamData;
+ m_data = data;
+}
+
+QString EventParameter::asString() const
+{
+ return m_string;
+}
+
+KURL EventParameter::asUrl() const
+{
+ return m_url;
+}
+
+DirectoryListing EventParameter::asDirectoryListing() const
+{
+ return m_directoryListing;
+}
+
+DirectoryTree EventParameter::asDirectoryTree() const
+{
+ return m_directoryTree;
+}
+
+ErrorCode EventParameter::asErrorCode() const
+{
+ return m_errorCode;
+}
+
+filesize_t EventParameter::asFileSize() const
+{
+ return m_fileSize;
+}
+
+bool EventParameter::asBoolean() const
+{
+ return (bool) m_fileSize;
+}
+
+void *EventParameter::asData() const
+{
+ return m_data;
+}
+
+Event::Event(Type type, QValueList<EventParameter> params)
+ : QCustomEvent(65123),
+ m_type(type),
+ m_params(params)
+{
+}
+
+Event::~Event()
+{
+}
+
+EventHandler::EventHandler(Thread *thread)
+ : QObject(),
+ m_thread(thread)
+{
+}
+
+void EventHandler::customEvent(QCustomEvent *e)
+{
+ if (e->type() == 65123) {
+ Event *ev = static_cast<Event*>(e);
+
+ emit engineEvent(ev);
+
+ switch (ev->type()) {
+ case Event::EventConnect: emit connected(); break;
+ case Event::EventDisconnect: emit disconnected(); break;
+ case Event::EventResponse:
+ case Event::EventMultiline: {
+ emit gotResponse(ev->getParameter(0).asString());
+ break;
+ }
+ case Event::EventRaw: emit gotRawResponse(ev->getParameter(0).asString()); break;
+ default: break;
+ }
+ }
+}
+
+}
diff --git a/kftpgrabber/src/engine/event.h b/kftpgrabber/src/engine/event.h
new file mode 100644
index 0000000..e21a45e
--- /dev/null
+++ b/kftpgrabber/src/engine/event.h
@@ -0,0 +1,372 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPNETWORKEVENT_H
+#define KFTPNETWORKEVENT_H
+
+#include <qobject.h>
+#include <qevent.h>
+#include <qshared.h>
+
+#include "directorylisting.h"
+
+namespace KFTPEngine {
+
+/**
+ * Engine reset codes. TODO description of each reset code.
+ */
+enum ResetCode {
+ Ok,
+ UserAbort,
+ Failed,
+ FailedSilently
+};
+
+/**
+ * Engine error codes. TODO: description of each error code.
+ */
+enum ErrorCode {
+ ConnectFailed,
+ LoginFailed,
+ PermissionDenied,
+ FileNotFound,
+ OperationFailed,
+ ListFailed,
+ FileOpenFailed
+};
+
+/**
+ * This class is used for event parameter passing between the socket
+ * thread and the main thread. It supports multiple parameter types.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class EventParameter {
+public:
+ /**
+ * Parameter type enum.
+ */
+ enum Type {
+ ParamString,
+ ParamUrl,
+ ParamDirListing,
+ ParamDirTree,
+ ParamErrorCode,
+ ParamSize,
+ ParamData
+ };
+
+ EventParameter();
+
+ /**
+ * Constructs a new string parameter.
+ *
+ * @param string The QString value
+ */
+ EventParameter(const QString &string);
+
+ /**
+ * Construct a new url parameter.
+ *
+ * @param url The KURL value
+ */
+ EventParameter(const KURL &url);
+
+ /**
+ * Construct a new directory listing parameter.
+ *
+ * @param listing The DirectoryListing value
+ */
+ EventParameter(DirectoryListing listing);
+
+ /**
+ * Construct a new directory tree parameter.
+ *
+ * @param tree The DirectoryTree value
+ */
+ EventParameter(DirectoryTree tree);
+
+ /**
+ * Construct a new error code parameter.
+ *
+ * @param error The ErrorCode value
+ */
+ EventParameter(ErrorCode error);
+
+ /**
+ * Construct a new filesize parameter.
+ *
+ * @param size The filesize_t value
+ */
+ EventParameter(filesize_t size);
+
+ /**
+ * Constructs a new data parameter.
+ *
+ * @param data A pointer to some data.
+ */
+ EventParameter(void *data);
+
+ /**
+ * Returns the parameter's string value.
+ *
+ * @return Parameter's string value
+ */
+ QString asString() const;
+
+ /**
+ * Returns the parameter's url value.
+ *
+ * @return Parameter's url value
+ */
+ KURL asUrl() const;
+
+ /**
+ * Returns the parameter's directory listing value.
+ *
+ * @return Parameter's directory listing value
+ */
+ DirectoryListing asDirectoryListing() const;
+
+ /**
+ * Returns the parameter's directory tree value.
+ *
+ * @return Parameter's directory tree value.
+ */
+ DirectoryTree asDirectoryTree() const;
+
+ /**
+ * Returns the parameter's error code value.
+ *
+ * @return Parameter's error code value
+ */
+ ErrorCode asErrorCode() const;
+
+ /**
+ * Returns the parameter's filesize value.
+ *
+ * @return Parameter's filesize value
+ */
+ filesize_t asFileSize() const;
+
+ /**
+ * Returns the parameter's boolean value.
+ *
+ * @return Parameter's boolean value
+ */
+ bool asBoolean() const;
+
+ /**
+ * Returns raw parameter data pointer.
+ *
+ * @return Raw parameter data pointer
+ */
+ void *asData() const;
+private:
+ Type m_type;
+
+ QString m_string;
+ KURL m_url;
+ DirectoryListing m_directoryListing;
+ DirectoryTree m_directoryTree;
+ ErrorCode m_errorCode;
+ filesize_t m_fileSize;
+ void *m_data;
+};
+
+/**
+ * A wakeup event is a special type event used to transfer some response from
+ * the GUI to the engine that has been temporarly suspended. After receiving
+ * this event, the current command handler's wakeup() method will be called
+ * with this event as a parameter.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class WakeupEvent {
+public:
+ /**
+ * Possible wakeup event types. Each type should subclass this class to
+ * provide any custom methods needed.
+ */
+ enum Type {
+ WakeupFileExists,
+ WakeupPubkey
+ };
+
+ /**
+ * Constructs a new wakeup event of specified type.
+ *
+ * @param type Event type
+ */
+ WakeupEvent(Type type) : m_type(type) {}
+private:
+ Type m_type;
+};
+
+/**
+ * A file exists wakeup event that is used to continue pending transfers.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class FileExistsWakeupEvent : public WakeupEvent {
+public:
+ /**
+ * Possible actions the engine can take.
+ */
+ enum Action {
+ Overwrite,
+ Rename,
+ Resume,
+ Skip
+ };
+
+ /**
+ * Constructs a new file exists wakeup event with Skip action as default.
+ */
+ FileExistsWakeupEvent() : WakeupEvent(WakeupFileExists), action(Skip) {}
+
+ Action action;
+ QString newFileName;
+};
+
+/**
+ * A public key password request event for SFTP connections.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class PubkeyWakeupEvent : public WakeupEvent {
+public:
+ /**
+ * Constructs a new public key wakeup event.
+ */
+ PubkeyWakeupEvent() : WakeupEvent(WakeupPubkey) {}
+
+ QString password;
+};
+
+/**
+ * This class represents an event that is passed to the EventHandler for
+ * processing. It can have multiple EventParameters.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class Event : public QCustomEvent {
+public:
+ enum Type {
+ EventMessage,
+ EventCommand,
+ EventResponse,
+ EventMultiline,
+ EventRaw,
+ EventDirectoryListing,
+ EventDisconnect,
+ EventError,
+ EventConnect,
+ EventReady,
+ EventState,
+ EventScanComplete,
+ EventRetrySuccess,
+ EventReloadNeeded,
+
+ // Transfer events
+ EventTransferComplete,
+ EventResumeOffset,
+
+ // Events that require wakeup events
+ EventFileExists,
+ EventPubkeyPassword
+ };
+
+ /**
+ * Construct a new event with a parameter list.
+ *
+ * @param params Parameter list
+ */
+ Event(Type type, QValueList<EventParameter> params);
+ ~Event();
+
+ /**
+ * Return the event's type.
+ *
+ * @return Event's type
+ */
+ Type type() { return m_type; }
+
+ /**
+ * Returns the parameter with a specific index.
+ *
+ * @param index Parameter's index
+ * @return An EventParameter object
+ */
+ EventParameter getParameter(int index) { return m_params[index]; }
+protected:
+ Type m_type;
+ QValueList<EventParameter> m_params;
+};
+
+class Thread;
+
+/**
+ * This class handles events receieved from the thread and passes them
+ * on to the GUI as normal Qt signals.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class EventHandler : public QObject {
+Q_OBJECT
+public:
+ /**
+ * Construct a new event handler.
+ *
+ * @param thread The thread this event handler belongs to
+ */
+ EventHandler(Thread *thread);
+protected:
+ void customEvent(QCustomEvent *e);
+protected:
+ Thread *m_thread;
+signals:
+ void engineEvent(KFTPEngine::Event *event);
+
+ void connected();
+ void disconnected();
+ void gotResponse(const QString &text);
+ void gotRawResponse(const QString &text);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/ftpdirectoryparser.cpp b/kftpgrabber/src/engine/ftpdirectoryparser.cpp
new file mode 100644
index 0000000..074328c
--- /dev/null
+++ b/kftpgrabber/src/engine/ftpdirectoryparser.cpp
@@ -0,0 +1,1144 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "ftpdirectoryparser.h"
+#include "ftpsocket.h"
+
+#include <qvaluevector.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+
+#include <time.h>
+#include <sys/stat.h>
+
+namespace KFTPEngine {
+
+class DToken {
+public:
+ enum TokenTypeInfo {
+ Unknown,
+ Yes,
+ No
+ };
+
+ DToken()
+ : m_token(QString::null),
+ m_valid(false)
+ {
+ }
+
+ DToken(const QString &token, int start = 0)
+ : m_token(token),
+ m_length(token.length()),
+ m_start(start),
+ m_valid(true),
+ m_numeric(Unknown),
+ m_leftNumeric(Unknown),
+ m_rightNumeric(Unknown)
+ {
+ }
+
+ int getStart()
+ {
+ return m_start;
+ }
+
+ QString getToken()
+ {
+ return m_token;
+ }
+
+ int getLength()
+ {
+ return m_length;
+ }
+
+ QString getString(int type = 0)
+ {
+ switch (type) {
+ case 0: return m_token; break;
+ case 1: {
+ if (!isRightNumeric() || isNumeric())
+ return QString::null;
+
+ int pos = m_length - 1;
+ while (m_token[pos] >= '0' && m_token[pos] <= '9')
+ pos--;
+
+ return m_token.mid(0, pos + 1);
+ break;
+ }
+ case 2: {
+ if (!isLeftNumeric() || isNumeric())
+ return QString::null;
+
+ int len = 0;
+ while (m_token[len] >= '0' && m_token[len] <= '9')
+ len++;
+
+ return m_token.mid(0, len);
+ break;
+ }
+ }
+
+ return QString::null;
+ }
+
+ int find(const char *chr, unsigned int start = 0) const
+ {
+ if (!chr)
+ return -1;
+
+ for (unsigned int i = start; i < m_length; i++) {
+ for (int c = 0; chr[c]; c++) {
+ if (m_token[i] == chr[c])
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ unsigned long long getInteger()
+ {
+ return m_token.toULongLong();
+ }
+
+ unsigned long long getInteger(unsigned int start, int len)
+ {
+ return m_token.mid(start, len).toULongLong();
+ }
+
+ bool isValid()
+ {
+ return m_valid;
+ }
+
+ bool isNumeric()
+ {
+ if (m_numeric == Unknown) {
+ bool ok;
+ (void) m_token.toInt(&ok);
+
+ m_numeric = ok ? Yes : No;
+ }
+
+ return m_numeric == Yes;
+ }
+
+
+ bool isNumeric(unsigned int start, unsigned int len)
+ {
+ len = start + len < m_length ? start + len : m_length;
+
+ for (unsigned int i = start; i < len; i++) {
+ if (m_token[i] < '0' || m_token[i] > '9')
+ return false;
+ }
+
+ return true;
+ }
+
+ bool isLeftNumeric()
+ {
+ if (m_leftNumeric == Unknown) {
+ if (m_length < 2)
+ m_leftNumeric = No;
+ else if (m_token[0] < '0' || m_token[0] > '9')
+ m_leftNumeric = No;
+ else
+ m_leftNumeric = Yes;
+ }
+
+ return m_leftNumeric == Yes;
+ }
+
+ bool isRightNumeric()
+ {
+ if (m_rightNumeric == Unknown) {
+ if (m_length < 2)
+ m_rightNumeric = No;
+ else if (m_token[m_length - 1] < '0' || m_token[m_length - 1] > '9')
+ m_rightNumeric = No;
+ else
+ m_rightNumeric = Yes;
+ }
+
+ return m_rightNumeric == Yes;
+ }
+
+ QChar operator[](unsigned int n) const
+ {
+ return m_token[n];
+ }
+private:
+ QString m_token;
+ unsigned int m_length;
+ int m_start;
+ bool m_valid;
+
+ TokenTypeInfo m_numeric;
+ TokenTypeInfo m_leftNumeric;
+ TokenTypeInfo m_rightNumeric;
+};
+
+class DLine {
+public:
+ DLine(const QString &line)
+ : m_line(line.stripWhiteSpace()),
+ m_parsePos(0)
+ {
+ }
+
+ bool getToken(unsigned int index, DToken &token, bool toEnd = false)
+ {
+ if (!toEnd) {
+ if (m_tokens.count() > index) {
+ token = m_tokens[index];
+ return true;
+ }
+
+ unsigned int start = m_parsePos;
+ while (m_parsePos < m_line.length()) {
+ if (m_line[m_parsePos] == ' ') {
+ m_tokens.append(DToken(m_line.mid(start, m_parsePos - start), start));
+
+ while (m_line[m_parsePos] == ' ' && m_parsePos < m_line.length())
+ m_parsePos++;
+
+ if (m_tokens.count() > index) {
+ token = m_tokens[index];
+ return true;
+ }
+
+ start = m_parsePos;
+ }
+
+ m_parsePos++;
+ }
+
+ if (m_parsePos != start) {
+ m_tokens.append(DToken(m_line.mid(start, m_parsePos - start), start));
+ }
+
+ if (m_tokens.count() > index) {
+ token = m_tokens[index];
+ return true;
+ }
+
+ return false;
+ } else {
+ if (m_endLineTokens.count() > index) {
+ token = m_endLineTokens[index];
+ return true;
+ }
+
+ if (m_tokens.count() <= index && !getToken(index, token))
+ return false;
+
+ for (unsigned int i = m_endLineTokens.count(); i <= index; i++) {
+ m_endLineTokens.append(DToken(m_line.mid(m_tokens[i].getStart())));
+ }
+
+ token = m_endLineTokens[index];
+ return true;
+ }
+ }
+private:
+ QStringList m_stringList;
+ QValueVector<DToken> m_tokens;
+ QValueVector<DToken> m_endLineTokens;
+ QString m_line;
+ unsigned int m_parsePos;
+};
+
+FtpDirectoryParser::FtpDirectoryParser(FtpSocket *socket)
+ : m_socket(socket),
+ m_listing(DirectoryListing(socket->getCurrentDirectory()))
+{
+ // Populate month names as they appear in the listing
+ m_monthNameMap["jan"] = 1;
+ m_monthNameMap["feb"] = 2;
+ m_monthNameMap["mar"] = 3;
+ m_monthNameMap["apr"] = 4;
+ m_monthNameMap["may"] = 5;
+ m_monthNameMap["jun"] = 6;
+ m_monthNameMap["june"] = 6;
+ m_monthNameMap["jul"] = 7;
+ m_monthNameMap["july"] = 7;
+ m_monthNameMap["aug"] = 8;
+ m_monthNameMap["sep"] = 9;
+ m_monthNameMap["sept"] = 9;
+ m_monthNameMap["oct"] = 10;
+ m_monthNameMap["nov"] = 11;
+ m_monthNameMap["dec"] = 12;
+
+ m_monthNameMap["1"] = 1;
+ m_monthNameMap["01"] = 1;
+ m_monthNameMap["2"] = 2;
+ m_monthNameMap["02"] = 2;
+ m_monthNameMap["3"] = 3;
+ m_monthNameMap["03"] = 3;
+ m_monthNameMap["4"] = 4;
+ m_monthNameMap["04"] = 4;
+ m_monthNameMap["5"] = 5;
+ m_monthNameMap["05"] = 5;
+ m_monthNameMap["6"] = 6;
+ m_monthNameMap["06"] = 6;
+ m_monthNameMap["7"] = 7;
+ m_monthNameMap["07"] = 7;
+ m_monthNameMap["8"] = 8;
+ m_monthNameMap["08"] = 8;
+ m_monthNameMap["9"] = 9;
+ m_monthNameMap["09"] = 9;
+ m_monthNameMap["10"] = 10;
+ m_monthNameMap["11"] = 11;
+ m_monthNameMap["12"] = 12;
+}
+
+void FtpDirectoryParser::addDataLine(const QString &line)
+{
+ QString tmp(line);
+ tmp.append("\n");
+ addData(tmp.ascii(), tmp.length());
+}
+
+void FtpDirectoryParser::addData(const char *data, int len)
+{
+ // Append new data to the buffer and check for any new lines
+ m_buffer.append(QString::fromAscii(data, len));
+
+ int pos;
+ while ((pos = m_buffer.find('\n')) > -1) {
+ DirectoryEntry entry;
+ QString line = m_buffer.mid(0, pos).stripWhiteSpace();
+ line = m_socket->remoteEncoding()->decode(QCString(line.ascii()));
+
+ if (parseLine(line, entry) && !entry.filename().isEmpty()) {
+ if (entry.type() == '-')
+ entry.setType('f');
+
+ m_listing.addEntry(entry);
+ }
+
+ // Remove what we just parsed
+ m_buffer.remove(0, pos + 1);
+ }
+}
+
+bool FtpDirectoryParser::parseMlsd(const QString &line, DirectoryEntry &entry)
+{
+ QStringList facts = QStringList::split(';', line);
+ QStringList::Iterator end = facts.end();
+
+ for (QStringList::Iterator i = facts.begin(); i != end; ++i) {
+ if ((*i).contains('=')) {
+ QString key = (*i).section('=', 0, 0).lower();
+ QString value = (*i).section('=', 1, 1);
+
+ if (key == "type") {
+ if (value == "file")
+ entry.setType('f');
+ else if (value == "dir")
+ entry.setType('d');
+ } else if (key == "size") {
+ entry.setSize(value.toULongLong());
+ } else if (key == "modify") {
+ struct tm dt;
+
+ dt.tm_year = value.left(4).toInt() - 1900;
+ dt.tm_mon = value.mid(4, 2).toInt() - 1;
+ dt.tm_mday = value.mid(6, 2).toInt();
+ dt.tm_hour = value.mid(8, 2).toInt();
+ dt.tm_min = value.mid(10, 2).toInt();
+ dt.tm_sec = value.mid(12, 2).toInt();
+ entry.setTime(mktime(&dt));
+ } else if (key == "unix.mode") {
+ entry.setPermissions(value.toInt(0, 8));
+ } else if (key == "unix.uid") {
+ entry.setOwner(value);
+ } else if (key == "unix.gid") {
+ entry.setGroup(value);
+ }
+ } else {
+ entry.setFilename((*i).stripWhiteSpace());
+ }
+ }
+
+ return true;
+}
+
+bool FtpDirectoryParser::parseUnixPermissions(const QString &permissions, DirectoryEntry &entry)
+{
+ int p = 0;
+
+ if (permissions[1] == 'r') p |= S_IRUSR;
+ if (permissions[2] == 'w') p |= S_IWUSR;
+ if (permissions[3] == 'x' || permissions[3] == 's') p |= S_IXUSR;
+
+ if (permissions[4] == 'r') p |= S_IRGRP;
+ if (permissions[5] == 'w') p |= S_IWGRP;
+ if (permissions[6] == 'x' || permissions[6] == 's') p |= S_IXGRP;
+
+ if (permissions[7] == 'r') p |= S_IROTH;
+ if (permissions[8] == 'w') p |= S_IWOTH;
+ if (permissions[9] == 'x' || permissions[9] == 't') p |= S_IXOTH;
+
+ if (permissions[3] == 's' || permissions[3] == 'S') p |= S_ISUID;
+ if (permissions[6] == 's' || permissions[6] == 'S') p |= S_ISGID;
+ if (permissions[9] == 't' || permissions[9] == 'T') p |= S_ISVTX;
+
+ entry.setPermissions(p);
+}
+
+bool FtpDirectoryParser::parseLine(const QString &line, DirectoryEntry &entry)
+{
+ DLine *tLine = new DLine(line);
+ bool done = false;
+
+ // Invalidate timestamp
+ entry.setTime(-1);
+ entry.timeStruct.tm_year = 0;
+ entry.timeStruct.tm_mon = 0;
+ entry.timeStruct.tm_hour = 0;
+ entry.timeStruct.tm_mday = 0;
+ entry.timeStruct.tm_min = 0;
+ entry.timeStruct.tm_sec = 0;
+ entry.timeStruct.tm_wday = 0;
+ entry.timeStruct.tm_yday = 0;
+ entry.timeStruct.tm_isdst = 0;
+
+ // Attempt machine friendly format first, when socket supports MLSD
+ if (m_socket->getConfigInt("feat.mlsd"))
+ done = parseMlsd(line, entry);
+
+ if (!done)
+ done = parseUnix(tLine, entry);
+ if (!done)
+ done = parseDos(tLine, entry);
+ if (!done)
+ done = parseVms(tLine, entry);
+
+ if (done) {
+ // Convert datetime to UNIX epoch
+ if (entry.time() == -1) {
+ // Correct format for mktime
+ entry.timeStruct.tm_year -= 1900;
+ entry.timeStruct.tm_mon -= 1;
+ entry.setTime(mktime(&entry.timeStruct));
+ }
+
+ // Add symlink if any
+ if (entry.filename().contains(" -> ") > 0) {
+ int pos = entry.filename().findRev(" -> ");
+
+ entry.setLink(entry.filename().mid(pos + 4));
+ entry.setFilename(entry.filename().mid(0, pos));
+ }
+
+ // Parse owner into group/owner
+ if (entry.owner().contains(" ") > 0) {
+ int pos = entry.owner().find(" ");
+
+ entry.setGroup(entry.owner().mid(pos + 1));
+ entry.setOwner(entry.owner().mid(0, pos));
+ }
+
+ // Remove unwanted names
+ if (entry.filename() == "." || entry.filename() == "..") {
+ entry.setFilename(QString::null);
+ }
+ }
+
+ delete tLine;
+ return done;
+}
+
+bool FtpDirectoryParser::parseUnix(DLine *line, DirectoryEntry &entry)
+{
+ int index = 0;
+ DToken token;
+
+ if (!line->getToken(index, token))
+ return false;
+
+
+ char chr = token[0];
+ if (chr != 'b' &&
+ chr != 'c' &&
+ chr != 'd' &&
+ chr != 'l' &&
+ chr != 'p' &&
+ chr != 's' &&
+ chr != '-')
+ return false;
+
+ QString permissions = token.getString();
+ entry.setType(chr);
+
+ // Check for netware servers, which split the permissions into two parts
+ bool netware = false;
+ if (token.getLength() == 1) {
+ if (!line->getToken(++index, token))
+ return false;
+
+ permissions += " " + token.getString();
+ netware = true;
+ }
+
+ parseUnixPermissions(permissions, entry);
+
+ int numOwnerGroup = 3;
+ if (!netware) {
+ // Filter out groupid, we don't need it
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (!token.isNumeric())
+ index--;
+ }
+
+ // Repeat until numOwnerGroup is 0 since not all servers send every possible field
+ int startindex = index;
+ do {
+ // Reset index
+ index = startindex;
+
+ entry.setOwner(QString::null);
+ for (int i = 0; i < numOwnerGroup; i++) {
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (i)
+ entry.setOwner(entry.owner() + " ");
+
+ entry.setOwner(entry.owner() + token.getString());
+ }
+
+ if (!line->getToken(++index, token))
+ return false;
+
+
+ // Check for concatenated groupname and size fields
+ filesize_t size;
+ if (!parseComplexFileSize(token, size)) {
+ if (!token.isRightNumeric())
+ continue;
+
+ entry.setSize(token.getInteger());
+ } else {
+ entry.setSize(size);
+ }
+
+ // Append missing group to ownerGroup
+ if (!token.isNumeric() && token.isRightNumeric()) {
+ if (!entry.owner().isEmpty())
+ entry.setOwner(entry.owner() + " ");
+
+ entry.setOwner(entry.owner() + token.getString(1));
+ }
+
+ if (!parseUnixDateTime(line, index, entry))
+ continue;
+
+ // Get the filename
+ if (!line->getToken(++index, token, true))
+ continue;
+
+ entry.setFilename(token.getString());
+
+ // Filter out cpecial chars at the end of the filenames
+ chr = token[token.getLength() - 1];
+ if (chr == '/' ||
+ chr == '|' ||
+ chr == '*')
+ entry.setFilename(entry.filename().mid(0, entry.filename().length() - 1));
+
+ return true;
+ } while (--numOwnerGroup);
+
+ return false;
+}
+
+bool FtpDirectoryParser::parseUnixDateTime(DLine *line, int &index, DirectoryEntry &entry)
+{
+ DToken token;
+
+ // Get the month date field
+ QString dateMonth;
+ if (!line->getToken(++index, token))
+ return false;
+
+ // Some servers use the following date formats:
+ // 26-05 2002, 2002-10-14, 01-jun-99
+ // slashes instead of dashes are also possible
+ int pos = token.find("-/");
+
+ if (pos != -1) {
+ int pos2 = token.find("-/", pos + 1);
+
+ if (pos2 == -1) {
+ // something like 26-05 2002
+ int day = token.getInteger(pos + 1, token.getLength() - pos - 1);
+
+ if (day < 1 || day > 31)
+ return false;
+
+ entry.timeStruct.tm_mday = day;
+ dateMonth = token.getString().left(pos);
+ } else if (!parseShortDate(token, entry)) {
+ return false;
+ }
+ } else {
+ dateMonth = token.getString();
+ }
+
+ bool bHasYearAndTime = false;
+ if (!entry.timeStruct.tm_mday) {
+ // Get day field
+ if (!line->getToken(++index, token))
+ return false;
+
+ int dateDay;
+
+ // Check for non-numeric day
+ if (!token.isNumeric() && !token.isLeftNumeric()) {
+ if (dateMonth.right(1) == ".")
+ dateMonth.remove(dateMonth.length() - 1, 1);
+
+ bool tmp;
+ dateDay = dateMonth.toInt(&tmp);
+ if (!tmp)
+ return false;
+
+ dateMonth = token.getString();
+ } else {
+ dateDay = token.getInteger();
+
+ if (token[token.getLength() - 1] == ',')
+ bHasYearAndTime = true;
+ }
+
+ if (dateDay < 1 || dateDay > 31)
+ return false;
+
+ entry.timeStruct.tm_mday = dateDay;
+ }
+
+ if (!entry.timeStruct.tm_mon) {
+ // Check month name
+ if (dateMonth.right(1) == "," || dateMonth.right(1) == ".")
+ dateMonth.remove(dateMonth.length() - 1, 1);
+
+ dateMonth = dateMonth.lower();
+
+ QMap<QString, int>::iterator iter = m_monthNameMap.find(dateMonth);
+ if (iter == m_monthNameMap.end())
+ return false;
+
+ entry.timeStruct.tm_mon = iter.data();
+ }
+
+ // Get time/year field
+ if (!line->getToken(++index, token))
+ return false;
+
+ pos = token.find(":.-");
+ if (pos != -1) {
+ // token is a time
+ if (!pos || static_cast<size_t>(pos) == (token.getLength() - 1))
+ return false;
+
+ QString str = token.getString();
+ bool tmp;
+ int hour = str.left(pos).toInt(&tmp);
+ if (!tmp)
+ return false;
+
+ int minute = str.mid(pos + 1).toInt(&tmp);
+ if (!tmp)
+ return false;
+
+ if (hour < 0 || hour > 23)
+ return false;
+
+ if (minute < 0 || minute > 59)
+ return false;
+
+ entry.timeStruct.tm_hour = hour;
+ entry.timeStruct.tm_min = minute;
+
+ // Some servers use times only for files nweer than 6 months,
+ int year = QDate::currentDate().year();
+ int now = QDate::currentDate().day() + 31 * QDate::currentDate().month();
+ int file = entry.timeStruct.tm_mon * 31 + entry.timeStruct.tm_mday;
+
+ if (now >= file)
+ entry.timeStruct.tm_year = year;
+ else
+ entry.timeStruct.tm_year = year - 1;
+ } else if (!entry.timeStruct.tm_year) {
+ // token is a year
+ if (!token.isNumeric() && !token.isLeftNumeric())
+ return false;
+
+ int year = token.getInteger();
+ if (year > 3000)
+ return false;
+
+ if (year < 1000)
+ year += 1900;
+
+ entry.timeStruct.tm_year = year;
+
+ if (bHasYearAndTime) {
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (token.find(":") == 2 && token.getLength() == 5 && token.isLeftNumeric() && token.isRightNumeric()) {
+ int pos = token.find(":");
+
+ // token is a time
+ if (!pos || static_cast<size_t>(pos) == (token.getLength() - 1))
+ return false;
+
+ QString str = token.getString();
+ bool tmp;
+ long hour = str.left(pos).toInt(&tmp);
+ if (!tmp)
+ return false;
+
+ long minute = str.mid(pos + 1).toInt(&tmp);
+ if (!tmp)
+ return false;
+
+ if (hour < 0 || hour > 23)
+ return false;
+
+ if (minute < 0 || minute > 59)
+ return false;
+
+ entry.timeStruct.tm_hour = hour;
+ entry.timeStruct.tm_min = minute;
+ } else {
+ index--;
+ }
+ }
+ } else {
+ index--;
+ }
+
+ return true;
+}
+
+bool FtpDirectoryParser::parseShortDate(DToken &token, DirectoryEntry &entry)
+{
+ if (token.getLength() < 1)
+ return false;
+
+ bool gotYear = false;
+ bool gotMonth = false;
+ bool gotDay = false;
+ bool gotMonthName = false;
+
+ int value = 0;
+
+ int pos = token.find("-./");
+ if (pos < 1)
+ return false;
+
+ if (!token.isNumeric(0, pos)) {
+ // Seems to be monthname-dd-yy
+
+ // Check month name
+ QString dateMonth = token.getString().mid(0, pos);
+ dateMonth = dateMonth.lower();
+
+ QMap<QString, int>::iterator iter = m_monthNameMap.find(dateMonth);
+ if (iter == m_monthNameMap.end())
+ return false;
+
+ entry.timeStruct.tm_mon = iter.data();
+ gotMonth = true;
+ gotMonthName = true;
+ } else if (pos == 4) {
+ // Seems to be yyyy-mm-dd
+ int year = token.getInteger(0, pos);
+
+ if (year < 1900 || year > 3000)
+ return false;
+
+ entry.timeStruct.tm_year = year;
+ gotYear = true;
+ } else if (pos <= 2) {
+ int value = token.getInteger(0, pos);
+
+ if (token[pos] == '.') {
+ // Maybe dd.mm.yyyy
+ if (value < 1900 || value > 3000)
+ return false;
+
+ entry.timeStruct.tm_mday = value;
+ gotDay = true;
+ } else {
+ // Detect mm-dd-yyyy or mm/dd/yyyy and
+ // dd-mm-yyyy or dd/mm/yyyy
+ if (value < 1)
+ return false;
+
+ if (value > 12) {
+ if (value > 31)
+ return false;
+
+ entry.timeStruct.tm_mday = value;
+ gotDay = true;
+ } else {
+ entry.timeStruct.tm_mon = value;
+ gotMonth = true;
+ }
+ }
+ } else {
+ return false;
+ }
+
+
+ int pos2 = token.find("-./", pos + 1);
+
+ if (pos2 == -1 || (pos2 - pos) == 1)
+ return false;
+
+ if (static_cast<size_t>(pos2) == (token.getLength() - 1))
+ return false;
+
+ // If we already got the month and the second field is not numeric,
+ // change old month into day and use new token as month
+ if (!token.isNumeric(pos + 1, pos2 - pos - 1) && gotMonth) {
+ if (gotMonthName)
+ return false;
+
+ if (gotDay)
+ return false;
+
+ gotDay = true;
+ gotMonth = false;
+ entry.timeStruct.tm_mday = entry.timeStruct.tm_mon;
+ }
+
+ if (gotYear || gotDay) {
+ // Month field in yyyy-mm-dd or dd-mm-yyyy
+ // Check month name
+ QString dateMonth = token.getString().mid(pos + 1, pos2 - pos - 1);
+ dateMonth = dateMonth.lower();
+
+ QMap<QString, int>::iterator iter = m_monthNameMap.find(dateMonth);
+ if (iter == m_monthNameMap.end())
+ return false;
+
+ entry.timeStruct.tm_mon = iter.data();
+ gotMonth = true;
+ } else {
+ int value = token.getInteger(pos + 1, pos2 - pos - 1);
+
+ // Day field in mm-dd-yyyy
+ if (value < 1 || value > 31)
+ return false;
+
+ entry.timeStruct.tm_mday = value;
+ gotDay = true;
+ }
+
+ value = token.getInteger(pos2 + 1, token.getLength() - pos2 - 1);
+ if (gotYear) {
+ // Day field in yyy-mm-dd
+ if (!value || value > 31)
+ return false;
+
+ entry.timeStruct.tm_mday = value;
+ gotDay = true;
+ } else {
+ if (value < 0)
+ return false;
+
+ if (value < 50) {
+ value += 2000;
+ } else if (value < 1000) {
+ value += 1900;
+ }
+
+ entry.timeStruct.tm_year = value;
+ gotYear = true;
+ }
+
+ if (!gotMonth || !gotDay || !gotYear)
+ return false;
+
+ return true;
+}
+
+bool FtpDirectoryParser::parseDos(DLine *line, DirectoryEntry &entry)
+{
+ int index = 0;
+ DToken token;
+
+ // Get first token, has to be a valid date
+ if (!line->getToken(index, token))
+ return false;
+
+ if (!parseShortDate(token, entry))
+ return false;
+
+ // Extract time
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (!parseTime(token, entry))
+ return false;
+
+ // If next token is <DIR>, entry is a directory
+ // else, it should be the filesize.
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (token.getString() == "<DIR>") {
+ entry.setType('d');
+ entry.setSize(0);
+ } else if (token.isNumeric() || token.isLeftNumeric()) {
+ // Convert size, filter out separators
+ unsigned long size = 0;
+ int len = token.getLength();
+
+ for (int i = 0; i < len; i++) {
+ char chr = token[i];
+
+ if (chr == ',' || chr == '.')
+ continue;
+
+ if (chr < '0' || chr > '9')
+ return false;
+
+ size *= 10;
+ size += chr - '0';
+ }
+
+ entry.setSize(size);
+ entry.setType('f');
+ } else {
+ return false;
+ }
+
+ // Extract filename
+ if (!line->getToken(++index, token, true))
+ return false;
+
+ entry.setFilename(token.getString());
+
+ return true;
+}
+
+
+bool FtpDirectoryParser::parseTime(DToken &token, DirectoryEntry &entry)
+{
+ int pos = token.find(":");
+ if (pos < 1 || static_cast<unsigned int>(pos) >= (token.getLength() - 1))
+ return false;
+
+ int hour = token.getInteger(0, pos);
+ if (hour < 0 || hour > 23)
+ return false;
+
+ int minute = token.getInteger(pos + 1, 2);
+ if (minute < 0 || minute > 59)
+ return false;
+
+ // Convert to 24h format
+ if (!token.isRightNumeric()) {
+ if (token[token.getLength() - 2] == 'P') {
+ if (hour < 12) {
+ hour += 12;
+ }
+ } else if (hour == 12) {
+ hour = 0;
+ }
+ }
+
+ entry.timeStruct.tm_hour = hour;
+ entry.timeStruct.tm_min = minute;
+
+ return true;
+}
+
+bool FtpDirectoryParser::parseVms(DLine *line, DirectoryEntry &entry)
+{
+ DToken token;
+ int index = 0;
+
+ if (!line->getToken(index, token))
+ return false;
+
+ int pos = token.find(";");
+
+ if (pos == -1)
+ return false;
+
+ if (pos > 4 && token.getString().mid(pos - 4, 4) == ".DIR") {
+ entry.setType('d');
+ entry.setFilename(token.getString().left(pos - 4) + token.getString().mid(pos));
+ } else {
+ entry.setType('f');
+ entry.setFilename(token.getString());
+ }
+
+ // Get size
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (!token.isNumeric() && !token.isLeftNumeric())
+ return false;
+
+ entry.setSize(token.getInteger());
+
+ // Get date
+ if (!line->getToken(++index, token))
+ return false;
+
+ if (!parseShortDate(token, entry))
+ return false;
+
+ // Get time
+ if (!line->getToken(++index, token))
+ return true;
+
+ if (!parseTime(token, entry)) {
+ int len = token.getLength();
+
+ if (token[0] == '[' && token[len] != ']')
+ return false;
+ if (token[0] == '(' && token[len] != ')')
+ return false;
+ if (token[0] != '[' && token[len] == ']')
+ return false;
+ if (token[0] != '(' && token[len] == ')')
+ return false;
+
+ index--;
+ }
+
+ // Owner / group
+ while (line->getToken(++index, token)) {
+ int len = token.getLength();
+
+ if (len > 2 && token[0] == '(' && token[len - 1] == ')')
+ entry.setPermissions(0);
+ else if (len > 2 && token[0] == '[' && token[len - 1] == ']')
+ entry.setOwner(token.getString().mid(1, len - 2));
+ else
+ entry.setPermissions(0);
+ }
+
+ return true;
+}
+
+bool FtpDirectoryParser::parseComplexFileSize(DToken &token, filesize_t &size)
+{
+ if (token.isNumeric()) {
+ size = token.getInteger();
+ return true;
+ }
+
+ int len = token.getLength() - 1;
+
+ char last = token[len];
+ if (last == 'B' || last == 'b') {
+ char c = token[len];
+
+ if (c < '0' || c > '9') {
+ last = token[len];
+ len--;
+ }
+ }
+
+ size = 0;
+
+ int dot = -1;
+ for (int i = 0; i < len; i++) {
+ char c = token[i];
+
+ if (c >= '0' && c <= '9') {
+ size *= 10;
+ size += c - '0';
+ } else if (c == '.') {
+ if (dot != -1)
+ return false;
+
+ dot = len - i - 1;
+ } else {
+ return false;
+ }
+ }
+
+ switch (last) {
+ case 'k':
+ case 'K': {
+ size *= 1000;
+ break;
+ }
+ case 'm':
+ case 'M': {
+ size *= 1000 * 1000;
+ break;
+ }
+ case 'g':
+ case 'G': {
+ size *= 1000 * 1000 * 1000;
+ break;
+ }
+ case 't':
+ case 'T': {
+ size *= 1000 * 1000;
+ size *= 1000 * 1000;
+ break;
+ }
+ case 'b':
+ case 'B': break;
+ default: return false;
+ }
+
+ while (dot-- > 0)
+ size /= 10;
+
+ return true;
+}
+
+}
diff --git a/kftpgrabber/src/engine/ftpdirectoryparser.h b/kftpgrabber/src/engine/ftpdirectoryparser.h
new file mode 100644
index 0000000..1b56831
--- /dev/null
+++ b/kftpgrabber/src/engine/ftpdirectoryparser.h
@@ -0,0 +1,92 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPENGINEFTPDIRECTORYPARSER_H
+#define KFTPENGINEFTPDIRECTORYPARSER_H
+
+#include <qmap.h>
+
+#include "directorylisting.h"
+
+namespace KFTPEngine {
+
+class FtpSocket;
+
+class DToken;
+class DLine;
+
+/**
+ * This class can parse multiple directory formats. Some code portions have
+ * been taken from a windows FTP client "FileZilla by Tim Kosse" - the
+ * logic is mostly the same, the code has just been ported so it is more Qt
+ * and so it integrates nicely with the rest of the engine.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ * @author Tim Kosse <tim.kosse@gmx.de>
+ */
+class FtpDirectoryParser {
+public:
+ FtpDirectoryParser(FtpSocket *socket);
+
+ void addData(const char *data, int len);
+ void addDataLine(const QString &line);
+
+ bool parseLine(const QString &line, DirectoryEntry &entry);
+ DirectoryListing getListing() { return m_listing; }
+private:
+ FtpSocket *m_socket;
+ QString m_buffer;
+ DirectoryListing m_listing;
+
+ QMap<QString, int> m_monthNameMap;
+
+ bool parseMlsd(const QString &line, DirectoryEntry &entry);
+ bool parseUnix(DLine *line, DirectoryEntry &entry);
+ bool parseDos(DLine *line, DirectoryEntry &entry);
+ bool parseVms(DLine *line, DirectoryEntry &entry);
+
+ bool parseUnixDateTime(DLine *line, int &index, DirectoryEntry &entry);
+ bool parseShortDate(DToken &token, DirectoryEntry &entry);
+ bool parseTime(DToken &token, DirectoryEntry &entry);
+
+ bool parseComplexFileSize(DToken &token, filesize_t &size);
+
+ bool parseUnixPermissions(const QString &permissions, DirectoryEntry &entry);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/ftpsocket.cpp b/kftpgrabber/src/engine/ftpsocket.cpp
new file mode 100644
index 0000000..2741f4d
--- /dev/null
+++ b/kftpgrabber/src/engine/ftpsocket.cpp
@@ -0,0 +1,2749 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "ftpsocket.h"
+#include "thread.h"
+#include "ftpdirectoryparser.h"
+#include "cache.h"
+#include "speedlimiter.h"
+#include "ssl.h"
+
+#include "misc/kftpotpgenerator.h"
+#include "misc/config.h"
+
+#include <qdir.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <ksocketdevice.h>
+
+#include <utime.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+namespace KFTPEngine {
+
+FtpSocket::FtpSocket(Thread *thread)
+ : KNetwork::KStreamSocket(),
+ Socket(thread, "ftp"),
+ SpeedLimiterItem(),
+ m_login(false),
+ m_transferSocket(0),
+ m_directoryParser(0),
+ m_controlConnecting(false),
+ m_controlSsl(0),
+ m_dataSsl(0),
+ m_clientCert(0)
+{
+ enableRead(false);
+ setBlocking(false);
+}
+
+FtpSocket::~FtpSocket()
+{
+ protoDisconnect();
+}
+
+void FtpSocket::poll()
+{
+ if (m_controlConnecting) {
+ if (isFatalError(error())) {
+ slotError();
+ resetError();
+ m_controlConnecting = false;
+ return;
+ }
+
+ if (state() == Connected) {
+ m_controlConnecting = false;
+ slotConnected();
+ }
+
+ return;
+ }
+
+ slotControlTryRead();
+
+ if (!m_buffer.isEmpty())
+ processBuffer();
+
+ if (m_transferSocket) {
+ if (m_transferConnecting && m_transferSocket->state() == Connected) {
+ m_transferConnecting = false;
+ slotDataConnected();
+ } else if (!m_transferConnecting) {
+ if (getCurrentCommand() == Commands::CmdPut) {
+ if (m_transferStart >= 2)
+ slotDataTryWrite();
+ } else {
+ bool input;
+ m_transferSocket->socketDevice()->poll(&input, 0, 0, 0);
+
+ if (input)
+ slotDataTryRead();
+ }
+ }
+ } else if (m_serverSocket) {
+ bool input;
+ m_serverSocket->socketDevice()->poll(&input, 0, 0, 0);
+
+ if (input) {
+ KNetwork::KActiveSocketBase *socket = m_serverSocket->accept();
+
+ if (socket) {
+ slotDataAccept(static_cast<KNetwork::KStreamSocket*>(socket));
+ m_transferConnecting = false;
+ }
+ }
+ }
+
+ // Check for timeouts
+ // NOTE This should be moved to a QTimer's slot when ported to Qt 4
+ timeoutCheck();
+ keepaliveCheck();
+}
+
+void FtpSocket::slotControlTryRead()
+{
+ QString tmpStr;
+ Q_LONG size = 0;
+
+ // Read what we can
+ if (getConfigInt("ssl") && m_controlSsl) {
+ size = m_controlSsl->read(m_controlBuffer, sizeof(m_controlBuffer) - 1);
+
+ if (size == -1) {
+ protoDisconnect();
+ return;
+ }
+ } else
+ size = readBlock(m_controlBuffer, sizeof(m_controlBuffer) - 1);
+
+ if (error() != NoError) {
+ // Have we been disconnected ?
+ if (error() != WouldBlock)
+ protoDisconnect();
+
+ return;
+ }
+
+ if (size == 0)
+ return;
+
+ for (int i = 0; i < size; i++)
+ if (m_controlBuffer[i] == 0)
+ m_controlBuffer[i] = '!';
+
+ memset(m_controlBuffer + size, 0, sizeof(m_controlBuffer) - size);
+ m_buffer.append(m_controlBuffer);
+}
+
+void FtpSocket::processBuffer()
+{
+ // Parse any lines we might have
+ int pos;
+ while ((pos = m_buffer.find('\n')) > -1) {
+ QString line = m_buffer.mid(0, pos);
+ line = m_remoteEncoding->decode(QCString(line.ascii()));
+ parseLine(line);
+
+ // Remove what we just parsed
+ m_buffer.remove(0, pos + 1);
+ }
+}
+
+void FtpSocket::parseLine(const QString &line)
+{
+ // Is this the end of multiline response ?
+ if (!m_multiLineCode.isEmpty() && line.left(4) == m_multiLineCode) {
+ m_multiLineCode = "";
+ emitEvent(Event::EventResponse, line);
+ } else if (line[3] == '-' && m_multiLineCode.isEmpty()) {
+ m_multiLineCode = line.left(3) + " ";
+ emitEvent(Event::EventMultiline, line);
+ } else if (!m_multiLineCode.isEmpty()) {
+ emitEvent(Event::EventMultiline, line);
+ } else {
+ // Normal response
+ emitEvent(Event::EventResponse, line);
+ }
+
+ timeoutWait(false);
+
+ // Parse our response
+ m_response = line;
+ nextCommand();
+}
+
+bool FtpSocket::isResponse(const QString &code)
+{
+ QString ref;
+
+ if (isMultiline())
+ ref = m_multiLineCode;
+ else
+ ref = m_response;
+
+ return ref.left(code.length()) == code;
+}
+
+void FtpSocket::sendCommand(const QString &command)
+{
+ emitEvent(Event::EventCommand, command);
+ QCString buffer(m_remoteEncoding->encode(command) + "\r\n");
+
+ if (getConfigInt("ssl") && m_controlSsl)
+ m_controlSsl->write(buffer.data(), buffer.length());
+ else
+ writeBlock(buffer.data(), buffer.length());
+
+ timeoutWait(true);
+}
+
+void FtpSocket::resetCommandClass(ResetCode code)
+{
+ timeoutWait(false);
+
+ if (m_transferSocket && code != Ok) {
+ // Invalidate the socket
+ closeDataTransferSocket();
+
+ // Close the file that failed transfer
+ if (getTransferFile()->isOpen()) {
+ getTransferFile()->close();
+
+ if (getCurrentCommand() == Commands::CmdGet && getTransferFile()->size() == 0)
+ getTransferFile()->remove();
+ }
+ }
+
+ if (m_serverSocket && code != Ok)
+ delete m_serverSocket;
+
+ Socket::resetCommandClass(code);
+}
+
+// *******************************************************************************************
+// ***************************************** CONNECT *****************************************
+// *******************************************************************************************
+
+class FtpCommandConnect : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentAuthTls,
+ SentUser,
+ SentPass,
+ SentPbsz,
+ SentProt,
+ DoingSyst,
+ DoingFeat,
+ SentPwd
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandConnect, FtpSocket, CmdNone)
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ if (!socket()->isMultiline()) {
+ if (socket()->isResponse("2")) {
+ // Negotiate a SSL connection if configured
+ if (socket()->getConfigInt("ssl.use_tls")) {
+ currentState = SentAuthTls;
+ socket()->sendCommand("AUTH TLS");
+ } else {
+ // Send username
+ currentState = SentUser;
+ socket()->sendCommand("USER " + socket()->getCurrentUrl().user());
+ }
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("Connection has failed."));
+
+ socket()->protoAbort();
+ socket()->emitError(ConnectFailed);
+ }
+ }
+ break;
+ }
+ case SentAuthTls: {
+ if (socket()->isResponse("2")) {
+ socket()->m_controlSsl = new Ssl(socket());
+
+ // Setup client certificate if one was provided
+ if (socket()->m_clientCert)
+ socket()->m_controlSsl->setClientCertificate(socket()->m_clientCert);
+
+ if (socket()->m_controlSsl->connect()) {
+ socket()->emitEvent(Event::EventMessage, i18n("SSL negotiation successful. Connection is secured with %1 bit cipher %2.").arg(socket()->m_controlSsl->connectionInfo().getCipherUsedBits()).arg(socket()->m_controlSsl->connectionInfo().getCipher()));
+ socket()->setConfig("ssl", 1);
+
+ // Now send the username
+ currentState = SentUser;
+ socket()->sendCommand("USER " + socket()->getCurrentUrl().user());
+ } else {
+ delete socket()->m_controlSsl;
+ socket()->m_controlSsl = 0;
+
+ socket()->emitEvent(Event::EventMessage, i18n("SSL negotiation failed. Login aborted."));
+ socket()->resetCommandClass(Failed);
+
+ socket()->protoAbort();
+ }
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("SSL negotiation request failed. Login aborted."));
+ socket()->resetCommandClass(Failed);
+
+ socket()->protoAbort();
+ }
+ break;
+ }
+ case SentUser: {
+ if (socket()->isResponse("331")) {
+ // Send password
+ if (socket()->isResponse("331 Response to otp-") ||
+ socket()->isResponse("331 Response to s/key")) {
+ // OTP: 331 Response to otp-md5 41 or4828 ext required for foo.
+ QString tmp = socket()->getResponse();
+ tmp = tmp.section(' ', 3, 5);
+
+ KFTPOTPGenerator otp(tmp, socket()->getCurrentUrl().pass());
+ currentState = SentPass;
+ socket()->sendCommand("PASS " + otp.generateOTP());
+ } else {
+ socket()->sendCommand("PASS " + socket()->getCurrentUrl().pass());
+ currentState = SentPass;
+ }
+ } else if (socket()->isResponse("230")) {
+ // Some servers imediately send the 230 response for anonymous accounts
+ if (!socket()->isMultiline()) {
+ if (socket()->getConfigInt("ssl")) {
+ currentState = SentPbsz;
+ socket()->sendCommand("PBSZ 0");
+ } else {
+ // Do SYST
+ socket()->sendCommand("SYST");
+ currentState = DoingSyst;
+ }
+ }
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("Login has failed."));
+
+ socket()->protoAbort();
+ socket()->emitError(LoginFailed);
+ }
+ break;
+ }
+ case SentPass: {
+ if (socket()->isResponse("230")) {
+ if (!socket()->isMultiline()) {
+ if (socket()->getConfigInt("ssl")) {
+ currentState = SentPbsz;
+ socket()->sendCommand("PBSZ 0");
+ } else {
+ // Do SYST
+ socket()->sendCommand("SYST");
+ currentState = DoingSyst;
+ }
+ }
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("Login has failed."));
+
+ socket()->protoAbort();
+ socket()->emitError(LoginFailed);
+ }
+ break;
+ }
+ case SentPbsz: {
+ currentState = SentProt;
+ QString prot = "PROT ";
+
+ if (socket()->getConfigInt("ssl.prot_mode") == 0)
+ prot.append('P');
+ else
+ prot.append('C');
+
+ socket()->sendCommand(prot);
+ break;
+ }
+ case SentProt: {
+ if (socket()->isResponse("5")) {
+ // Fallback to unencrypted data channel
+ socket()->setConfig("ssl.prot_mode", 2);
+ }
+
+ currentState = DoingSyst;
+ socket()->sendCommand("SYST");
+ break;
+ }
+ case DoingSyst: {
+ socket()->sendCommand("FEAT");
+ currentState = DoingFeat;
+ break;
+ }
+ case DoingFeat: {
+ if (socket()->isMultiline()) {
+ parseFeat();
+ } else {
+ socket()->sendCommand("PWD");
+ currentState = SentPwd;
+ }
+ break;
+ }
+ case SentPwd: {
+ // Parse the current working directory
+ if (socket()->isResponse("2")) {
+ // 257 "/home/default/path"
+ QString tmp = socket()->getResponse();
+ int first = tmp.find('"') + 1;
+ tmp = tmp.mid(first, tmp.findRev('"') - first);
+
+ socket()->setDefaultDirectory(tmp);
+ socket()->setCurrentDirectory(tmp);
+ }
+
+ // Enable transmission of keepalive events
+ socket()->keepaliveStart();
+
+ currentState = None;
+ socket()->emitEvent(Event::EventMessage, i18n("Connected."));
+ socket()->emitEvent(Event::EventConnect);
+ socket()->m_login = true;
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+
+ void parseFeat()
+ {
+ QString feat = socket()->getResponse().stripWhiteSpace().upper();
+
+ if (feat.left(3).toInt() > 0 && feat[3] == '-')
+ feat.remove(0, 4);
+
+ if (feat.left(4) == "MDTM") {
+ // Server has MDTM (MoDification TiMe) support
+ socket()->setConfig("feat.mdtm", 1);
+ } else if (feat.left(4) == "PRET") {
+ // Server is a distributed ftp server and requires PRET for transfers
+ socket()->setConfig("feat.pret", 1);
+ } else if (feat.left(4) == "MLSD") {
+ // Server supports machine-friendly directory listings
+ socket()->setConfig("feat.mlsd", 1);
+ } else if (feat.left(4) == "REST") {
+ // Server supports resume operations
+ socket()->setConfig("feat.rest", 1);
+ } else if (feat.left(4) == "SSCN") {
+ // Server supports SSCN for secure site-to-site transfers
+ socket()->setConfig("feat.sscn", 1);
+ socket()->setConfig("feat.cpsv", 0);
+ } else if (feat.left(4) == "CPSV" && !socket()->getConfigInt("feat.sscn")) {
+ // Server supports CPSV for secure site-to-site transfers
+ socket()->setConfig("feat.cpsv", 1);
+ }
+ }
+};
+
+void FtpSocket::protoConnect(const KURL &url)
+{
+ emitEvent(Event::EventState, i18n("Connecting..."));
+ emitEvent(Event::EventMessage, i18n("Connecting to %1:%2...").arg(url.host()).arg(url.port()));
+
+ if (!getConfig("encoding").isEmpty())
+ changeEncoding(getConfig("encoding"));
+
+ // Start the connect procedure
+ m_controlConnecting = true;
+ setCurrentUrl(url);
+ KNetwork::KStreamSocket::connect(url.host(), QString::number(url.port()));
+}
+
+void FtpSocket::slotConnected()
+{
+ if (getConfigInt("ssl.use_implicit")) {
+ m_controlSsl = new Ssl(this);
+
+ // Setup client certificate if one was provided
+ if (m_clientCert)
+ m_controlSsl->setClientCertificate(m_clientCert);
+
+ if (m_controlSsl->connect()) {
+ emitEvent(Event::EventMessage, i18n("SSL negotiation successful. Connection is secured with %1 bit cipher %2.").arg(m_controlSsl->connectionInfo().getCipherUsedBits()).arg(m_controlSsl->connectionInfo().getCipher()));
+ setConfig("ssl", 1);
+ } else {
+ delete m_controlSsl;
+ m_controlSsl = 0;
+
+ emitEvent(Event::EventMessage, i18n("SSL negotiation failed. Connect aborted."));
+ resetCommandClass(Failed);
+
+ protoAbort();
+ }
+ }
+
+ timeoutWait(true);
+
+ emitEvent(Event::EventState, i18n("Logging in..."));
+ emitEvent(Event::EventMessage, i18n("Connected with server, waiting for welcome message..."));
+ setupCommandClass(FtpCommandConnect);
+}
+
+void FtpSocket::slotError()
+{
+ if (isFatalError(error())) {
+ emitEvent(Event::EventMessage, i18n("Failed to connect (%1)").arg(errorString(error())));
+ emitError(ConnectFailed);
+
+ resetCommandClass(FailedSilently);
+ }
+}
+
+// *******************************************************************************************
+// **************************************** DISCONNECT ***************************************
+// *******************************************************************************************
+
+void FtpSocket::protoDisconnect()
+{
+ Socket::protoDisconnect();
+
+ // Close SSL
+ if (getConfigInt("ssl") && m_controlSsl) {
+ m_controlSsl->close();
+ delete m_controlSsl;
+ m_controlSsl = 0;
+
+ if (m_clientCert) {
+ delete m_clientCert;
+ m_clientCert = 0;
+ }
+ }
+
+ // Terminate the connection
+ m_login = false;
+ KNetwork::KStreamSocket::close();
+}
+
+void FtpSocket::protoAbort()
+{
+ Socket::protoAbort();
+
+ if (getCurrentCommand() != Commands::CmdNone) {
+ // Abort current command
+ if (getCurrentCommand() == Commands::CmdConnect)
+ protoDisconnect();
+
+ if (m_cmdData)
+ resetCommandClass(UserAbort);
+
+ emitEvent(Event::EventMessage, i18n("Aborted."));
+ }
+}
+
+// *******************************************************************************************
+// ********************************* NEGOTIATE DATA CONNECTION *******************************
+// *******************************************************************************************
+
+class FtpCommandNegotiateData : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentSscnOff,
+ SentType,
+ SentProt,
+ SentPret,
+ NegotiateActive,
+ NegotiatePasv,
+ NegotiateEpsv,
+ HaveConnection,
+ SentRest,
+ SentDataCmd,
+ WaitTransfer
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandNegotiateData, FtpSocket, CmdNone)
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ if (socket()->getConfigInt("sscn.activated")) {
+ // First disable SSCN
+ currentState = SentSscnOff;
+ socket()->sendCommand("SSCN OFF");
+ return;
+ }
+ }
+ case SentSscnOff: {
+ if (currentState == SentSscnOff)
+ socket()->setConfig("sscn.activated", 0);
+
+ // Change type
+ currentState = SentType;
+ socket()->resetTransferStart();
+
+ QString type = "TYPE ";
+ type.append(socket()->getConfigInt("params.data_type"));
+ socket()->sendCommand(type);
+ break;
+ }
+ case SentType: {
+ if (socket()->getConfigInt("ssl") && socket()->getConfigInt("ssl.prot_mode") == 1) {
+ currentState = SentProt;
+
+ if (socket()->getPreviousCommand() == Commands::CmdList)
+ socket()->sendCommand("PROT P");
+ else
+ socket()->sendCommand("PROT C");
+ } else if (socket()->getConfigInt("feat.pret")) {
+ currentState = SentPret;
+ socket()->sendCommand("PRET " + socket()->getConfig("params.data_command"));
+ } else {
+ negotiateDataConnection();
+ }
+ break;
+ }
+ case SentProt: {
+ if (socket()->getConfigInt("feat.pret")) {
+ currentState = SentPret;
+ socket()->sendCommand("PRET " + socket()->getConfig("params.data_command"));
+ } else {
+ negotiateDataConnection();
+ }
+ break;
+ }
+ case SentPret: {
+ // PRET failed because of filesystem problems, abort right away!
+ if (socket()->isResponse("530")) {
+ socket()->emitError(PermissionDenied);
+ socket()->resetCommandClass(Failed);
+ return;
+ } else if (socket()->isResponse("550")) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ return;
+ } else if (socket()->isResponse("5")) {
+ // PRET is not supported, disable for future use
+ socket()->setConfig("feat.pret", 0);
+ }
+
+ negotiateDataConnection();
+ break;
+ }
+ case NegotiateActive: negotiateActive(); break;
+ case NegotiateEpsv: negotiateEpsv(); break;
+ case NegotiatePasv: negotiatePasv(); break;
+ case HaveConnection: {
+ // We have the connection
+ if (socket()->getConfigInt("params.data_rest_do")) {
+ currentState = SentRest;
+ socket()->sendCommand("REST " + QString::number(socket()->getConfigFs("params.data_rest")));
+ } else {
+ currentState = SentDataCmd;
+ socket()->sendCommand(socket()->getConfig("params.data_command"));
+ }
+ break;
+ }
+ case SentRest: {
+ if (!socket()->isResponse("2") && !socket()->isResponse("3")) {
+ socket()->setConfig("feat.rest", 0);
+ socket()->getTransferFile()->close();
+
+ bool ok;
+
+ if (socket()->getPreviousCommand() == Commands::CmdGet)
+ ok = socket()->getTransferFile()->open(IO_WriteOnly | IO_Truncate);
+ else
+ ok = socket()->getTransferFile()->open(IO_ReadOnly);
+
+ // Check if there was a problem opening the file
+ if (!ok) {
+ socket()->emitError(FileOpenFailed);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+ }
+
+ // We have sent REST, now send the data command
+ currentState = SentDataCmd;
+ socket()->sendCommand(socket()->getConfig("params.data_command"));
+ break;
+ }
+ case SentDataCmd: {
+ if (!socket()->isResponse("1")) {
+ // Some problems while executing the data command
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ if (!socket()->isMultiline()) {
+ socket()->checkTransferStart();
+ currentState = WaitTransfer;
+ }
+ break;
+ }
+ case WaitTransfer: {
+ if (!socket()->isResponse("2")) {
+ // Transfer has failed
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ if (!socket()->isMultiline()) {
+ // Transfer has been completed
+ socket()->checkTransferEnd();
+ }
+ break;
+ }
+ }
+ }
+
+ void negotiateDataConnection()
+ {
+ if (socket()->getConfigInt("feat.epsv")) {
+ negotiateEpsv();
+ } else if (socket()->getConfigInt("feat.pasv")) {
+ negotiatePasv();
+ } else {
+ negotiateActive();
+ }
+ }
+
+ void negotiateEpsv()
+ {
+ if (currentState == NegotiateEpsv) {
+ if (!socket()->isResponse("2")) {
+ // Negotiation failed
+ socket()->setConfig("feat.epsv", "0");
+
+ // Try the next thing
+ negotiateDataConnection();
+ return;
+ }
+
+ // 229 Entering Extended Passive Mode (|||55016|)
+ char *begin = strchr(socket()->getResponse().ascii(), '(');
+ int port;
+
+ if (!begin || sscanf(begin, "(|||%d|)", &port) != 1) {
+ // Unable to parse, try the next thing
+ socket()->setConfig("feat.epsv", "0");
+ negotiateDataConnection();
+ return;
+ }
+
+ // We have the address, let's setup the transfer socket and then
+ // we are done.
+ currentState = HaveConnection;
+ socket()->setupPassiveTransferSocket(QString::null, port);
+ } else {
+ // Just send the EPSV command
+ currentState = NegotiateEpsv;
+ socket()->sendCommand("EPSV");
+ }
+ }
+
+ void negotiatePasv()
+ {
+ if (currentState == NegotiatePasv) {
+ if (!socket()->isResponse("2")) {
+ // Negotiation failed
+ socket()->setConfig("feat.pasv", "0");
+
+ // Try the next thing
+ negotiateDataConnection();
+ return;
+ }
+
+ // Ok PASV command successfull - let's parse the result
+ int ip[6];
+ char *begin = strchr(socket()->getResponse().ascii(), '(');
+
+ // Some stinky servers don't respect RFC and do it on their own
+ if (!begin)
+ begin = strchr(socket()->getResponse().ascii(), '=');
+
+ if (!begin || (sscanf(begin, "(%d,%d,%d,%d,%d,%d)",&ip[0], &ip[1], &ip[2], &ip[3], &ip[4], &ip[5]) != 6 &&
+ sscanf(begin, "=%d,%d,%d,%d,%d,%d",&ip[0], &ip[1], &ip[2], &ip[3], &ip[4], &ip[5]) != 6)) {
+ // Unable to parse, try the next thing
+ socket()->setConfig("feat.pasv", "0");
+ negotiateDataConnection();
+ return;
+ }
+
+ // Convert to string
+ QString host;
+ int port;
+
+ host.sprintf("%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
+ port = ip[4] << 8 | ip[5];
+
+ // If the reported IP address is from a private IP range, this might be because the
+ // remote server is not properly configured. So we just use the server's real IP instead
+ // of the one we got (if the host is really local, then this should work as well).
+ if (!socket()->getConfigInt("feat.pret")) {
+ if (host.startsWith("192.168.") || host.startsWith("10.") || host.startsWith("172.16."))
+ host = socket()->peerAddress().nodeName();
+ }
+
+ // We have the address, let's setup the transfer socket and then
+ // we are done.
+ currentState = HaveConnection;
+ socket()->setupPassiveTransferSocket(host, port);
+ } else {
+ // Just send the PASV command
+ currentState = NegotiatePasv;
+ socket()->sendCommand("PASV");
+ }
+ }
+
+ void negotiateActive()
+ {
+ if (currentState == NegotiateActive) {
+ if (!socket()->isResponse("2")) {
+ if (socket()->getConfigInt("feat.eprt")) {
+ socket()->setConfig("feat.eprt", 0);
+ } else {
+ // Negotiation failed, reset since active is the last fallback
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+ } else {
+ currentState = HaveConnection;
+ socket()->nextCommandAsync();
+ return;
+ }
+ }
+
+ // Setup the socket and set the apropriate port command
+ currentState = NegotiateActive;
+
+ KNetwork::KSocketAddress address = socket()->setupActiveTransferSocket();
+ if (address.address()) {
+ if (socket()->getConfigInt("feat.eprt")) {
+ QString ianaFamily = QString::number(address.ianaFamily());
+
+ socket()->sendCommand("EPRT |" + ianaFamily + "|" + address.nodeName() + "|" + address.serviceName() + "|");
+ } else if (address.ianaFamily() == 1) {
+ QString format = address.nodeName().replace(".", ",");
+
+ format.append(",");
+ format.append(QString::number((unsigned char) address.address()->sa_data[0]));
+ format.append(",");
+ format.append(QString::number((unsigned char) address.address()->sa_data[1]));
+
+ socket()->sendCommand("PORT " + format);
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("Incompatible address family for PORT, but EPRT not supported, aborting!"));
+ socket()->resetCommandClass(Failed);
+ }
+ }
+ }
+};
+
+void FtpSocket::initializeTransferSocket()
+{
+ m_transferConnecting = true;
+ m_transferEnd = 0;
+ m_transferBytes = 0;
+ m_transferBufferSize = 4096;
+ m_transferBuffer = (char*) malloc(m_transferBufferSize);
+
+ m_speedLastTime = time(0);
+ m_speedLastBytes = 0;
+
+ // Setup the speed limiter
+ switch (getPreviousCommand()) {
+ case Commands::CmdGet: SpeedLimiter::self()->append(this, SpeedLimiter::Download); break;
+ case Commands::CmdPut: SpeedLimiter::self()->append(this, SpeedLimiter::Upload); break;
+ default: break;
+ }
+
+ m_transferSocket->enableRead(false);
+ m_transferSocket->setBlocking(false);
+ m_transferSocket->setAddressReuseable(true);
+}
+
+void FtpSocket::setupPassiveTransferSocket(const QString &host, int port)
+{
+ // Use the host from control connection if empty
+ QString realHost = host;
+ if (host.isEmpty() || getConfigInt("pasv.use_site_ip"))
+ realHost = peerAddress().nodeName();
+
+ // Let's connect
+ emitEvent(Event::EventMessage, i18n("Establishing data connection with %1:%2...").arg(realHost).arg(port));
+
+ if (!m_transferSocket)
+ m_transferSocket = new KNetwork::KStreamSocket();
+
+ initializeTransferSocket();
+ m_transferSocket->connect(realHost, QString::number(port));
+}
+
+KNetwork::KSocketAddress FtpSocket::setupActiveTransferSocket()
+{
+ if (!m_serverSocket)
+ m_serverSocket = new KNetwork::KServerSocket();
+
+ m_serverSocket->setAcceptBuffered(false);
+ m_serverSocket->setFamily(KNetwork::KResolver::InetFamily);
+
+ if (KFTPCore::Config::activeForcePort()) {
+ // Bind only to ports in a specified portrange
+ bool found = false;
+ unsigned int max = KFTPCore::Config::activeMaxPort();
+ unsigned int min = KFTPCore::Config::activeMinPort();
+
+ for (unsigned int port = min + rand() % (max - min + 1); port <= max; port++) {
+ m_serverSocket->setAddress(QString::number(port));
+ bool success = m_serverSocket->listen();
+
+ if (found = (success && m_serverSocket->error() == KSocketBase::NoError))
+ break;
+
+ m_serverSocket->close();
+ }
+
+ if (!found) {
+ emitEvent(Event::EventMessage, i18n("Unable to establish a listening socket."));
+ resetCommandClass(Failed);
+ return KNetwork::KSocketAddress();
+ }
+ } else {
+ m_serverSocket->setAddress("0");
+
+ if (!m_serverSocket->listen()) {
+ emitEvent(Event::EventMessage, i18n("Unable to establish a listening socket."));
+ resetCommandClass(Failed);
+ return KNetwork::KSocketAddress();
+ }
+ }
+
+ KNetwork::KSocketAddress serverAddr = m_serverSocket->localAddress();
+ KNetwork::KSocketAddress controlAddr = localAddress();
+ KNetwork::KSocketAddress request;
+
+ if (KFTPCore::Config::portForceIp() && !getConfigInt("active.no_force_ip")) {
+ QString remoteIp = peerAddress().nodeName();
+
+ if (KFTPCore::Config::ignoreExternalIpForLan() &&
+ (remoteIp.startsWith("192.168.") || remoteIp.startsWith("10.") || remoteIp.startsWith("172.16."))) {
+ request = controlAddr;
+ } else {
+ // Force a specified IP/hostname to be used in PORT
+ KNetwork::KResolverResults resolverResults;
+
+ resolverResults = KNetwork::KResolver::resolve(KFTPCore::Config::portIp(), "21");
+ if (resolverResults.error() < 0) {
+ // Well, we are unable to resolve the name, so we should use what we got
+ // from control socket
+ request = controlAddr;
+ } else {
+ // The name has been resolved and we have the address, so we should
+ // use it
+ request = resolverResults[0].address();
+ }
+ }
+ } else {
+ // Just use our IP we bound to when connecting to the remote server
+ request = controlAddr;
+ }
+
+ // Set the proper port
+ request.address()->sa_data[0] = serverAddr.address()->sa_data[0];
+ request.address()->sa_data[1] = serverAddr.address()->sa_data[1];
+
+ emitEvent(Event::EventMessage, i18n("Waiting for data connection on port %1...").arg(serverAddr.serviceName()));
+
+ return request;
+}
+
+void FtpSocket::slotDataAccept(KNetwork::KStreamSocket *socket)
+{
+ m_transferSocket = socket;
+ initializeTransferSocket();
+
+ // Socket has been accepted so the server is not needed anymore
+ delete m_serverSocket;
+
+ emitEvent(Event::EventMessage, i18n("Data connection established."));
+ checkTransferStart();
+}
+
+void FtpSocket::closeDataTransferSocket()
+{
+ if (m_dataSsl) {
+ m_dataSsl->close();
+ delete m_dataSsl;
+ m_dataSsl = 0;
+ }
+
+ // Free the buffer and invalidate the socket
+ free(m_transferBuffer);
+
+ m_transferSocket->close();
+ delete m_transferSocket;
+ m_transferBytes = 0;
+
+ SpeedLimiter::self()->remove(this);
+}
+
+void FtpSocket::transferCompleted()
+{
+ // Transfer has been completed, cleanup
+ closeDataTransferSocket();
+ checkTransferEnd();
+}
+
+void FtpSocket::checkTransferStart()
+{
+ if (++m_transferStart >= 2) {
+ // Setup SSL data connection
+ if (getConfigInt("ssl") && (getConfigInt("ssl.prot_mode") == 0 ||
+ (getConfigInt("ssl.prot_mode") == 1 && getToplevelCommand() == Commands::CmdList)) && !m_dataSsl) {
+ m_dataSsl = new Ssl(m_transferSocket);
+
+ if (m_dataSsl->connect()) {
+ emitEvent(Event::EventMessage, i18n("Data channel secured with %1 bit SSL.").arg(m_dataSsl->connectionInfo().getCipherUsedBits()));
+ } else {
+ emitEvent(Event::EventMessage, i18n("SSL negotiation for the data channel has failed. Aborting transfer."));
+ resetCommandClass(Failed);
+ return;
+ }
+ }
+ }
+}
+
+void FtpSocket::checkTransferEnd()
+{
+ if (++m_transferEnd >= 2) {
+ emitEvent(Event::EventMessage, i18n("Transfer completed."));
+ resetCommandClass();
+ }
+}
+
+void FtpSocket::slotDataConnected()
+{
+ emitEvent(Event::EventMessage, i18n("Data connection established."));
+
+ checkTransferStart();
+ nextCommand();
+}
+
+void FtpSocket::variableBufferUpdate(Q_LONG size)
+{
+ if (size > m_transferBufferSize - 64) {
+ if (m_transferBufferSize + 512 <= 32768) {
+ m_transferBufferSize += 512;
+ m_transferBuffer = (char*) realloc(m_transferBuffer, m_transferBufferSize);
+ }
+ } else if (size < m_transferBufferSize - 65) {
+ if (m_transferBufferSize - 512 >= 4096) {
+ m_transferBufferSize -= 512;
+ m_transferBuffer = (char*) realloc(m_transferBuffer, m_transferBufferSize);
+ }
+ }
+}
+
+void FtpSocket::slotDataTryWrite()
+{
+ bool updateVariableBuffer = true;
+
+ // Enforce speed limits
+ if (allowedBytes() > -1) {
+ m_transferBufferSize = allowedBytes();
+
+ if (m_transferBufferSize > 32768)
+ m_transferBufferSize = 32768;
+ else if (m_transferBufferSize == 0)
+ return;
+
+ m_transferBuffer = (char*) realloc(m_transferBuffer, m_transferBufferSize);
+ updateVariableBuffer = false;
+ } else if (m_transferBufferSize == 0) {
+ m_transferBufferSize = 4096;
+ m_transferBuffer = (char*) realloc(m_transferBuffer, m_transferBufferSize);
+ }
+
+ if (!getTransferFile()->isOpen())
+ return;
+
+ // If there is nothing to upload, just close the connection right away
+ if (getTransferFile()->size() == 0) {
+ transferCompleted();
+ return;
+ }
+
+ QFile::Offset tmpOffset = getTransferFile()->at();
+ Q_LONG readSize = getTransferFile()->readBlock(m_transferBuffer, m_transferBufferSize);
+
+ Q_LONG size = 0;
+
+ if (m_dataSsl)
+ size = m_dataSsl->write(m_transferBuffer, readSize);
+ else
+ size = m_transferSocket->writeBlock(m_transferBuffer, readSize);
+
+ if (size < 0) {
+ getTransferFile()->at(tmpOffset);
+ return;
+ } else if (size < readSize)
+ getTransferFile()->at(tmpOffset + size);
+
+ m_transferBytes += size;
+ updateUsage(size);
+ timeoutPing();
+
+ if (getTransferFile()->atEnd()) {
+ // We have reached the end of file, so we should terminate the connection
+ transferCompleted();
+ return;
+ }
+
+ if (updateVariableBuffer)
+ variableBufferUpdate(size);
+}
+
+void FtpSocket::slotDataTryRead()
+{
+ bool updateVariableBuffer = true;
+
+ // Enforce speed limits
+ if (allowedBytes() > -1) {
+ m_transferBufferSize = allowedBytes();
+
+ if (m_transferBufferSize > 32768)
+ m_transferBufferSize = 32768;
+ else if (m_transferBufferSize == 0)
+ return;
+
+ m_transferBuffer = (char*) realloc(m_transferBuffer, m_transferBufferSize);
+ updateVariableBuffer = false;
+ } else if (m_transferBufferSize == 0) {
+ m_transferBufferSize = 4096;
+ m_transferBuffer = (char*) realloc(m_transferBuffer, m_transferBufferSize);
+ }
+
+ Q_LONG size = 0;
+
+ if (m_dataSsl) {
+ size = m_dataSsl->read(m_transferBuffer, m_transferBufferSize);
+
+ if (size == -1) {
+ transferCompleted();
+ return;
+ }
+ } else {
+ size = m_transferSocket->readBlock(m_transferBuffer, m_transferBufferSize);
+
+ // Check if the connection has been closed
+ if (m_transferSocket->error() != NoError) {
+ if (m_transferSocket->error() != WouldBlock) {
+ transferCompleted();
+ return;
+ }
+ }
+ }
+
+ if (size <= 0) {
+ if (!m_dataSsl)
+ transferCompleted();
+
+ return;
+ }
+
+ updateUsage(size);
+ timeoutPing();
+
+ switch (getPreviousCommand()) {
+ case Commands::CmdList: {
+ // Feed the data to the directory listing parser
+ if (m_directoryParser)
+ m_directoryParser->addData(m_transferBuffer, size);
+ break;
+ }
+ case Commands::CmdGet: {
+ // Write to file
+ getTransferFile()->writeBlock(m_transferBuffer, size);
+ m_transferBytes += size;
+ break;
+ }
+ default: {
+ qDebug("WARNING: slotDataReadActivity called for an invalid command!");
+ return;
+ }
+ }
+
+ if (updateVariableBuffer)
+ variableBufferUpdate(size);
+}
+
+// *******************************************************************************************
+// ******************************************* LIST ******************************************
+// *******************************************************************************************
+
+class FtpCommandList : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentCwd,
+ SentStat,
+ WaitList
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandList, FtpSocket, CmdList)
+
+ QString path;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ path = socket()->getConfig("params.list.path");
+
+ if (socket()->isChained())
+ socket()->m_lastDirectoryListing = DirectoryListing();
+
+ // Change working directory
+ currentState = SentCwd;
+ socket()->changeWorkingDirectory(path);
+ break;
+ }
+ case SentCwd: {
+ if (!socket()->getConfigInt("status.cwd")) {
+ // Change directory has failed and we should be silent (=error reporting is off)
+ socket()->resetCommandClass();
+ return;
+ }
+
+ // Check the directory listing cache
+ DirectoryListing cached = Cache::self()->findCached(socket(), socket()->getCurrentDirectory());
+ if (cached.isValid()) {
+ socket()->emitEvent(Event::EventMessage, i18n("Using cached directory listing."));
+
+ if (socket()->isChained()) {
+ // We don't emit an event, because this list has been called from another
+ // command. Just save the listing.
+ socket()->m_lastDirectoryListing = cached;
+ } else
+ socket()->emitEvent(Event::EventDirectoryListing, cached);
+
+ socket()->resetCommandClass();
+ return;
+ }
+
+ socket()->m_directoryParser = new FtpDirectoryParser(socket());
+
+ // Support for faster stat directory listings over the control connection
+ if (socket()->getConfigInt("stat_listings")) {
+ currentState = SentStat;
+ socket()->sendCommand("STAT .");
+ return;
+ }
+
+ // First we have to initialize the data connection, another class will
+ // do this for us, so we just add it to the command chain
+ socket()->setConfig("params.data_rest_do", 0);
+ socket()->setConfig("params.data_type", 'A');
+
+ if (socket()->getConfigInt("feat.mlsd"))
+ socket()->setConfig("params.data_command", "MLSD");
+ else
+ socket()->setConfig("params.data_command", "LIST -a");
+
+ currentState = WaitList;
+ chainCommandClass(FtpCommandNegotiateData);
+ break;
+ }
+ case SentStat: {
+ if (!socket()->isResponse("2")) {
+ // The server doesn't support STAT, disable it and fallback
+ socket()->setConfig("stat_listings", 0);
+
+ socket()->setConfig("params.data_rest_do", 0);
+ socket()->setConfig("params.data_type", 'A');
+
+ if (socket()->getConfigInt("feat.mlsd"))
+ socket()->setConfig("params.data_command", "MLSD");
+ else
+ socket()->setConfig("params.data_command", "LIST -a");
+
+ currentState = WaitList;
+ chainCommandClass(FtpCommandNegotiateData);
+ return;
+ } else if (socket()->isMultiline()) {
+ // Some servers put the response code into the multiline reply
+ QString response = socket()->getResponse();
+ if (response.left(3) == "211")
+ response = response.mid(4);
+
+ socket()->m_directoryParser->addDataLine(response);
+ return;
+ }
+
+ // If we are done, just go on and emit the listing
+ }
+ case WaitList: {
+ // List has been received
+ if (socket()->isChained()) {
+ // We don't emit an event, because this list has been called from another
+ // command. Just save the listing.
+ socket()->m_lastDirectoryListing = socket()->m_directoryParser->getListing();
+ } else
+ socket()->emitEvent(Event::EventDirectoryListing, socket()->m_directoryParser->getListing());
+
+ // Cache the directory listing
+ Cache::self()->addDirectory(socket(), socket()->m_directoryParser->getListing());
+
+ delete socket()->m_directoryParser;
+ socket()->m_directoryParser = 0;
+
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoList(const KURL &path)
+{
+ emitEvent(Event::EventState, i18n("Fetching directory listing..."));
+ emitEvent(Event::EventMessage, i18n("Fetching directory listing..."));
+
+ // Set the directory that should be listed
+ setConfig("params.list.path", path.path());
+
+ activateCommandClass(FtpCommandList);
+}
+
+// *******************************************************************************************
+// ******************************************* GET *******************************************
+// *******************************************************************************************
+
+class FtpCommandGet : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentCwd,
+ SentMdtm,
+ StatDone,
+ DestChecked,
+ WaitTransfer
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandGet, FtpSocket, CmdGet)
+
+ KURL sourceFile;
+ KURL destinationFile;
+ time_t modificationTime;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ modificationTime = 0;
+ sourceFile.setPath(socket()->getConfig("params.get.source"));
+ destinationFile.setPath(socket()->getConfig("params.get.destination"));
+
+ // Attempt to CWD to the parent directory
+ currentState = SentCwd;
+ socket()->changeWorkingDirectory(sourceFile.directory());
+ break;
+ }
+ case SentCwd: {
+ // Send MDTM
+ if (socket()->getConfigInt("feat.mdtm")) {
+ currentState = SentMdtm;
+ socket()->sendCommand("MDTM " + sourceFile.path());
+ break;
+ } else {
+ // Don't break so we will get on to checking for file existance
+ }
+ }
+ case SentMdtm: {
+ if (currentState == SentMdtm) {
+ if (socket()->isResponse("550")) {
+ // The file probably doesn't exist, just ignore it
+ } else if (!socket()->isResponse("213")) {
+ socket()->setConfig("feat.mdtm", 0);
+ } else {
+ // Parse MDTM response
+ struct tm dt = {0,0,0,0,0,0,0,0,0,0,0};
+ QString tmp(socket()->getResponse());
+
+ tmp.remove(0, 4);
+ dt.tm_year = tmp.left(4).toInt() - 1900;
+ dt.tm_mon = tmp.mid(4, 2).toInt() - 1;
+ dt.tm_mday = tmp.mid(6, 2).toInt();
+ dt.tm_hour = tmp.mid(8, 2).toInt();
+ dt.tm_min = tmp.mid(10, 2).toInt();
+ dt.tm_sec = tmp.mid(12, 2).toInt();
+ modificationTime = mktime(&dt);
+ }
+ }
+
+ // Check if the local file exists and stat the remote file if so
+ if (QDir::root().exists(destinationFile.path())) {
+ socket()->protoStat(sourceFile);
+ currentState = StatDone;
+ return;
+ } else {
+ KStandardDirs::makeDir(destinationFile.directory());
+
+ // Don't break so we will get on to initiating the data connection
+ }
+ }
+ case StatDone: {
+ if (currentState == StatDone) {
+ DirectoryListing list;
+ list.addEntry(socket()->getStatResponse());
+
+ currentState = DestChecked;
+ socket()->emitEvent(Event::EventFileExists, list);
+ return;
+ }
+ }
+ case DestChecked: {
+ socket()->setConfig("params.data_rest_do", 0);
+
+ if (isWakeup()) {
+ // We have been waken up because a decision has been made
+ FileExistsWakeupEvent *event = static_cast<FileExistsWakeupEvent*>(m_wakeupEvent);
+
+ if (!socket()->getConfigInt("feat.rest") && event->action == FileExistsWakeupEvent::Resume)
+ event->action = FileExistsWakeupEvent::Overwrite;
+
+ switch (event->action) {
+ case FileExistsWakeupEvent::Rename: {
+ // Change the destination filename, otherwise it is the same as overwrite
+ destinationFile.setPath(event->newFileName);
+ }
+ case FileExistsWakeupEvent::Overwrite: {
+ socket()->getTransferFile()->setName(destinationFile.path());
+ socket()->getTransferFile()->open(IO_WriteOnly | IO_Truncate);
+
+ if (socket()->getConfigInt("feat.rest")) {
+ socket()->setConfig("params.data_rest_do", 1);
+ socket()->setConfig("params.data_rest", 0);
+ }
+ break;
+ }
+ case FileExistsWakeupEvent::Resume: {
+ socket()->getTransferFile()->setName(destinationFile.path());
+ socket()->getTransferFile()->open(IO_WriteOnly | IO_Append);
+
+ // Signal resume
+ socket()->emitEvent(Event::EventResumeOffset, socket()->getTransferFile()->size());
+
+ socket()->setConfig("params.data_rest_do", 1);
+ socket()->setConfig("params.data_rest", (filesize_t) socket()->getTransferFile()->size());
+ break;
+ }
+ case FileExistsWakeupEvent::Skip: {
+ // Transfer should be aborted
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ return;
+ }
+ }
+ } else {
+ // The file doesn't exist so we are free to overwrite
+ socket()->getTransferFile()->setName(destinationFile.path());
+ socket()->getTransferFile()->open(IO_WriteOnly | IO_Truncate);
+ }
+
+ // Check if there was a problem opening the file
+ if (!socket()->getTransferFile()->isOpen()) {
+ socket()->emitError(FileOpenFailed);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ // First we have to initialize the data connection, another class will
+ // do this for us, so we just add it to the command chain
+ socket()->setConfig("params.data_type", KFTPCore::Config::self()->ftpMode(sourceFile.path()));
+ socket()->setConfig("params.data_command", "RETR " + sourceFile.filename());
+
+ currentState = WaitTransfer;
+ chainCommandClass(FtpCommandNegotiateData);
+ break;
+ }
+ case WaitTransfer: {
+ // Transfer has been completed
+ socket()->getTransferFile()->close();
+
+ if (modificationTime != 0) {
+ // Use the modification time we got from MDTM
+ utimbuf tmp;
+ tmp.actime = time(0);
+ tmp.modtime = modificationTime;
+ utime(destinationFile.path().latin1(), &tmp);
+ }
+
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoGet(const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Transfering..."));
+ emitEvent(Event::EventMessage, i18n("Downloading file '%1'...").arg(source.fileName()));
+
+ // Set the source and destination
+ setConfig("params.get.source", source.path());
+ setConfig("params.get.destination", destination.path());
+
+ activateCommandClass(FtpCommandGet);
+}
+
+// *******************************************************************************************
+// ******************************************* CWD *******************************************
+// *******************************************************************************************
+
+class FtpCommandCwd : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentCwd,
+ SentPwd,
+ SentMkd,
+ SentCwdEnd
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandCwd, FtpSocket, CmdNone)
+
+ QString targetDirectory;
+ QString currentPathPart;
+ QString cached;
+ int currentPart;
+ int numParts;
+ bool shouldCreate;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ targetDirectory = socket()->getConfig("params.cwd.path");
+ socket()->setConfig("status.cwd", 1);
+
+ // If we are already there, no need to CWD
+ if (socket()->getCurrentDirectory() == targetDirectory) {
+ socket()->resetCommandClass();
+ return;
+ }
+
+ cached = Cache::self()->findCachedPath(socket(), targetDirectory);
+ if (!cached.isEmpty()) {
+ if (socket()->getCurrentDirectory() == cached) {
+ // We are already there
+ socket()->resetCommandClass();
+ return;
+ }
+ }
+
+ // First check the toplevel directory and if it exists we are done
+ currentState = SentCwd;
+ currentPart = 0;
+ numParts = targetDirectory.contains('/');
+ shouldCreate = socket()->getConfigInt("params.cwd.create");
+
+ socket()->sendCommand("CWD " + targetDirectory);
+ break;
+ }
+ case SentCwd: {
+ if (socket()->isMultiline())
+ return;
+
+ if (socket()->isResponse("250") && currentPart == 0) {
+ if (!cached.isEmpty()) {
+ socket()->setCurrentDirectory(cached);
+ socket()->resetCommandClass();
+ } else {
+ // Directory exists, check where we are
+ currentState = SentPwd;
+ socket()->sendCommand("PWD");
+ }
+ } else {
+ // Changing the working directory has failed
+ if (shouldCreate) {
+ currentPathPart = targetDirectory.section('/', 0, ++currentPart);
+ currentState = SentMkd;
+ socket()->sendCommand("MKD " + currentPathPart);
+ } else if (socket()->errorReporting()) {
+ socket()->emitError(socket()->getPreviousCommand() == Commands::CmdList ? ListFailed : FileNotFound);
+ socket()->resetCommandClass(Failed);
+ } else {
+ socket()->setConfig("status.cwd", 0);
+ socket()->resetCommandClass();
+ }
+ }
+ break;
+ }
+ case SentPwd: {
+ // Parse the current working directory
+ if (socket()->isResponse("2")) {
+ QString tmp = socket()->getResponse();
+ int first = tmp.find('"') + 1;
+ tmp = tmp.mid(first, tmp.findRev('"') - first);
+
+ // Set the current directory and cache it
+ socket()->setCurrentDirectory(tmp);
+ Cache::self()->addPath(socket(), tmp);
+
+ socket()->resetCommandClass();
+ } else if (socket()->errorReporting()) {
+ socket()->emitError(socket()->getPreviousCommand() == Commands::CmdList ? ListFailed : FileNotFound);
+ socket()->resetCommandClass(Failed);
+ } else {
+ socket()->setConfig("status.cwd", 0);
+ socket()->resetCommandClass();
+ }
+ break;
+ }
+ case SentMkd: {
+ // Invalidate parent cache
+ if (socket()->isResponse("2")) {
+ Cache::self()->invalidateEntry(socket(), KURL(currentPathPart).directory());
+ }
+
+ if (currentPart == numParts) {
+ // We are done, since all directories have been created
+ currentState = SentCwdEnd;
+ socket()->sendCommand("CWD " + targetDirectory);
+ } else {
+ currentPathPart = targetDirectory.section('/', 0, ++currentPart);
+ currentState = SentMkd;
+ socket()->sendCommand("MKD " + currentPathPart);
+ }
+ break;
+ }
+ case SentCwdEnd: {
+ if (socket()->isMultiline())
+ return;
+
+ // See where we are and set current working directory
+ currentState = SentPwd;
+ socket()->sendCommand("PWD");
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::changeWorkingDirectory(const QString &path, bool shouldCreate)
+{
+ // Set the path to cwd to
+ setConfig("params.cwd.path", path);
+ setConfig("params.cwd.create", shouldCreate);
+
+ activateCommandClass(FtpCommandCwd);
+}
+
+// *******************************************************************************************
+// ******************************************* PUT *******************************************
+// *******************************************************************************************
+
+class FtpCommandPut : public Commands::Base {
+public:
+ enum State {
+ None,
+ WaitCwd,
+ SentSize,
+ StatDone,
+ DestChecked,
+ WaitTransfer
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandPut, FtpSocket, CmdPut)
+
+ KURL sourceFile;
+ KURL destinationFile;
+
+ bool fetchedSize;
+ filesize_t destinationSize;
+
+ void cleanup()
+ {
+ // Unclean upload termination, be sure to erase the cached stat infos
+ Cache::self()->invalidateEntry(socket(), destinationFile.directory());
+ }
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ sourceFile.setPath(socket()->getConfig("params.get.source"));
+ destinationFile.setPath(socket()->getConfig("params.get.destination"));
+ fetchedSize = false;
+
+ // Check if the local file exists
+ if (!QDir::root().exists(sourceFile.path())) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ // Change to the current working directory, creating any directories that are
+ // still missing
+ currentState = WaitCwd;
+ socket()->changeWorkingDirectory(destinationFile.directory(), true);
+ break;
+ }
+ case WaitCwd: {
+ // Check if the remote file exists
+ if (socket()->getConfigInt("feat.size")) {
+ currentState = SentSize;
+ socket()->sendCommand("SIZE " + destinationFile.path());
+ } else {
+ // SIZE is not available, try stat directly
+ currentState = StatDone;
+ socket()->protoStat(destinationFile);
+ }
+ break;
+ }
+ case SentSize: {
+ if (socket()->isResponse("213")) {
+ destinationSize = socket()->getResponse().mid(4).toULongLong();
+ fetchedSize = true;
+
+ // File exists, we have to stat to get more data
+ currentState = StatDone;
+ socket()->protoStat(destinationFile);
+ } else if (socket()->isResponse("500") || socket()->getResponse().contains("Operation not permitted", false)) {
+ // Yes, some servers don't support the SIZE command :/
+ socket()->setConfig("feat.size", 0);
+
+ currentState = StatDone;
+ socket()->protoStat(destinationFile);
+ } else {
+ currentState = DestChecked;
+ process();
+ }
+ break;
+ }
+ case StatDone: {
+ if (!socket()->getStatResponse().filename().isEmpty()) {
+ if (fetchedSize) {
+ if (socket()->getStatResponse().size() != destinationSize) {
+ // It would seem that the size has changed, cached data is invalid
+ Cache::self()->invalidateEntry(socket(), destinationFile.directory());
+
+ currentState = StatDone;
+ socket()->protoStat(destinationFile);
+ return;
+ }
+ }
+
+ // Remote file exists, emit a request for action
+ DirectoryListing list;
+ list.addEntry(socket()->getStatResponse());
+
+ currentState = DestChecked;
+ socket()->emitEvent(Event::EventFileExists, list);
+ return;
+ }
+
+ // Don't break here
+ }
+ case DestChecked: {
+ socket()->setConfig("params.data_rest_do", 0);
+
+ if (isWakeup()) {
+ // We have been waken up because a decision has been made
+ FileExistsWakeupEvent *event = static_cast<FileExistsWakeupEvent*>(m_wakeupEvent);
+
+ if (!socket()->getConfigInt("feat.rest") && event->action == FileExistsWakeupEvent::Resume)
+ event->action = FileExistsWakeupEvent::Overwrite;
+
+ switch (event->action) {
+ case FileExistsWakeupEvent::Rename: {
+ // Change the destination filename, otherwise it is the same as overwrite
+ destinationFile.setPath(event->newFileName);
+ }
+ case FileExistsWakeupEvent::Overwrite: {
+ socket()->getTransferFile()->setName(sourceFile.path());
+ socket()->getTransferFile()->open(IO_ReadOnly);
+
+ if (socket()->getConfigInt("feat.rest")) {
+ socket()->setConfig("params.data_rest_do", 1);
+ socket()->setConfig("params.data_rest", 0);
+ }
+ break;
+ }
+ case FileExistsWakeupEvent::Resume: {
+ socket()->getTransferFile()->setName(sourceFile.path());
+ socket()->getTransferFile()->open(IO_ReadOnly);
+ socket()->getTransferFile()->at(socket()->getStatResponse().size());
+
+ // Signal resume
+ socket()->emitEvent(Event::EventResumeOffset, socket()->getStatResponse().size());
+
+ socket()->setConfig("params.data_rest_do", 1);
+ socket()->setConfig("params.data_rest", (filesize_t) socket()->getStatResponse().size());
+ break;
+ }
+ case FileExistsWakeupEvent::Skip: {
+ // Transfer should be aborted
+ markClean();
+
+ socket()->resetCommandClass(UserAbort);
+ socket()->emitEvent(Event::EventTransferComplete);
+ return;
+ }
+ }
+ } else {
+ // The file doesn't exist so we are free to overwrite
+ socket()->getTransferFile()->setName(sourceFile.path());
+ socket()->getTransferFile()->open(IO_ReadOnly);
+ }
+
+ // Check if there was a problem opening the file
+ if (!socket()->getTransferFile()->isOpen()) {
+ socket()->emitError(FileOpenFailed);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ // First we have to initialize the data connection, another class will
+ // do this for us, so we just add it to the command chain
+ socket()->setConfig("params.data_type", KFTPCore::Config::self()->ftpMode(destinationFile.path()));
+ socket()->setConfig("params.data_command", "STOR " + destinationFile.filename());
+
+ currentState = WaitTransfer;
+ chainCommandClass(FtpCommandNegotiateData);
+ break;
+ }
+ case WaitTransfer: {
+ // Transfer has been completed
+ Cache::self()->updateDirectoryEntry(socket(), destinationFile, socket()->getTransferFile()->size());
+ socket()->getTransferFile()->close();
+ markClean();
+
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoPut(const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Transfering..."));
+ emitEvent(Event::EventMessage, i18n("Uploading file '%1'...").arg(source.fileName()));
+
+ // Set the source and destination
+ setConfig("params.get.source", source.path());
+ setConfig("params.get.destination", destination.path());
+
+ activateCommandClass(FtpCommandPut);
+}
+
+// *******************************************************************************************
+// **************************************** REMOVE *******************************************
+// *******************************************************************************************
+
+class FtpCommandRemove : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentCwd,
+ SentRemove
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandRemove, FtpSocket, CmdNone)
+
+ QString destinationPath;
+ QString parentDirectory;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ destinationPath = socket()->getConfig("params.remove.path");
+ parentDirectory = socket()->getConfig("params.remove.parent");
+
+ currentState = SentRemove;
+
+ if (socket()->getConfigInt("params.remove.directory")) {
+ if (socket()->getCurrentDirectory() != parentDirectory) {
+ // We should change working directory to parent directory before removing
+ currentState = SentCwd;
+ socket()->sendCommand("CWD " + parentDirectory);
+ } else {
+ socket()->sendCommand("RMD " + destinationPath);
+ }
+ } else {
+ socket()->sendCommand("DELE " + destinationPath);
+ }
+ break;
+ }
+ case SentCwd: {
+ if (socket()->isMultiline())
+ return;
+
+ if (socket()->isResponse("2")) {
+ // CWD was successful
+ socket()->setCurrentDirectory(parentDirectory);
+ }
+
+ currentState = SentRemove;
+ socket()->sendCommand("RMD " + destinationPath);
+ break;
+ }
+ case SentRemove: {
+ if (socket()->isMultiline())
+ return;
+
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(socket(), parentDirectory);
+ Cache::self()->invalidatePath(socket(), destinationPath);
+
+ if (!socket()->isChained())
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ }
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoRemove(const KURL &path)
+{
+ emitEvent(Event::EventState, i18n("Removing..."));
+
+ // Set the file to remove
+ setConfig("params.remove.parent", path.directory());
+ setConfig("params.remove.path", path.path());
+
+ activateCommandClass(FtpCommandRemove);
+}
+
+// *******************************************************************************************
+// **************************************** RENAME *******************************************
+// *******************************************************************************************
+
+class FtpCommandRename : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentRnfr,
+ SentRnto
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandRename, FtpSocket, CmdRename)
+
+ QString sourcePath;
+ QString destinationPath;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ sourcePath = socket()->getConfig("params.rename.source");
+ destinationPath = socket()->getConfig("params.rename.destination");
+
+ currentState = SentRnfr;
+ socket()->sendCommand("RNFR " + sourcePath);
+ break;
+ }
+ case SentRnfr: {
+ if (socket()->isResponse("3")) {
+ currentState = SentRnto;
+ socket()->sendCommand("RNTO " + destinationPath);
+ } else
+ socket()->resetCommandClass(Failed);
+ break;
+ }
+ case SentRnto: {
+ if (socket()->isResponse("2")) {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(socket(), KURL(sourcePath).directory());
+ Cache::self()->invalidateEntry(socket(), KURL(destinationPath).directory());
+
+ Cache::self()->invalidatePath(socket(), sourcePath);
+ Cache::self()->invalidatePath(socket(), destinationPath);
+
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ } else
+ socket()->resetCommandClass(Failed);
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoRename(const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Renaming..."));
+
+ // Set rename options
+ setConfig("params.rename.source", source.path());
+ setConfig("params.rename.destination", destination.path());
+
+ activateCommandClass(FtpCommandRename);
+}
+
+// *******************************************************************************************
+// **************************************** CHMOD ********************************************
+// *******************************************************************************************
+
+class FtpCommandChmod : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentChmod
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandChmod, FtpSocket, CmdChmod)
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ currentState = SentChmod;
+
+ QString chmod;
+ chmod.sprintf("SITE CHMOD %.3d %s", socket()->getConfigInt("params.chmod.mode"),
+ socket()->getConfig("params.chmod.path").ascii());
+ socket()->sendCommand(chmod);
+ break;
+ }
+ case SentChmod: {
+ if (!socket()->isResponse("2"))
+ socket()->resetCommandClass(Failed);
+ else {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(socket(), KURL(socket()->getConfig("params.chmod.path")).directory());
+
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ }
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoChmodSingle(const KURL &path, int mode)
+{
+ emitEvent(Event::EventState, i18n("Changing mode..."));
+
+ // Set chmod options
+ setConfig("params.chmod.path", path.path());
+ setConfig("params.chmod.mode", mode);
+
+ activateCommandClass(FtpCommandChmod);
+}
+
+// *******************************************************************************************
+// **************************************** MKDIR ********************************************
+// *******************************************************************************************
+
+class FtpCommandMkdir : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentMkdir
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandMkdir, FtpSocket, CmdMkdir)
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ currentState = SentMkdir;
+ socket()->changeWorkingDirectory(socket()->getConfig("params.mkdir.path"), true);
+ break;
+ }
+ case SentMkdir: {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(socket(), KURL(socket()->getCurrentDirectory()).directory());
+
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoMkdir(const KURL &path)
+{
+ emitEvent(Event::EventState, i18n("Making directory..."));
+
+ setConfig("params.mkdir.path", path.path());
+ activateCommandClass(FtpCommandMkdir);
+}
+
+// *******************************************************************************************
+// ******************************************* RAW *******************************************
+// *******************************************************************************************
+
+class FtpCommandRaw : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentRaw
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandRaw, FtpSocket, CmdRaw)
+
+ QString response;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ currentState = SentRaw;
+ socket()->sendCommand(socket()->getConfig("params.raw.command"));
+ break;
+ }
+ case SentRaw: {
+ response.append(socket()->getResponse());
+
+ if (!socket()->isMultiline()) {
+ socket()->emitEvent(Event::EventRaw, response);
+ socket()->resetCommandClass();
+ }
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoRaw(const QString &raw)
+{
+ setConfig("params.raw.command", raw);
+ activateCommandClass(FtpCommandRaw);
+}
+
+// *******************************************************************************************
+// ******************************************* FXP *******************************************
+// *******************************************************************************************
+
+class FtpCommandFxp : public Commands::Base {
+public:
+ enum State {
+ None,
+
+ // Source socket
+ SourceSentCwd,
+ SourceSentStat,
+ SourceDestVerified,
+ SourceSentType,
+ SourceSentSscn,
+ SourceSentProt,
+ SourceWaitType,
+ SourceSentPret,
+ SourceSentPasv,
+ SourceDoRest,
+ SourceSentRest,
+ SourceDoRetr,
+ SourceSentRetr,
+ SourceWaitTransfer,
+ SourceResetProt,
+
+ // Destination socket
+ DestSentStat,
+ DestWaitCwd,
+ DestDoType,
+ DestSentType,
+ DestSentSscn,
+ DestSentProt,
+ DestDoPort,
+ DestSentPort,
+ DestSentRest,
+ DestDoStor,
+ DestSentStor,
+ DestWaitTransfer,
+ DestResetProt
+ };
+
+ enum ProtectionMode {
+ ProtClear = 0,
+ ProtPrivate = 1,
+ ProtSSCN = 2
+ };
+
+ enum TransferMode {
+ TransferPASV = 0,
+ TransferCPSV = 1
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandFxp, FtpSocket, CmdFxp)
+
+ FtpSocket *companion;
+
+ KURL sourceFile;
+ KURL destinationFile;
+ filesize_t resumeOffset;
+
+ void cleanup()
+ {
+ // We have been interrupted, so we have to abort the companion as well
+ if (!socket()->getConfigInt("params.fxp.abort")) {
+ companion->setConfig("params.fxp.abort", 1);
+ companion->protoAbort();
+ }
+
+ // Unclean upload termination, be sure to erase the cached stat infos
+ if (!socket()->getConfigInt("params.fxp.keep_cache"))
+ Cache::self()->invalidateEntry(socket(), destinationFile.directory());
+ }
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ sourceFile.setPath(socket()->getConfig("params.fxp.source"));
+ destinationFile.setPath(socket()->getConfig("params.fxp.destination"));
+ socket()->setConfig("params.fxp.keep_cache", 0);
+
+ // Who are we ? Where shall we begin ?
+ if (socket()->getConfigInt("params.fxp.companion")) {
+ // We are the companion, so we should check the destination
+ socket()->setConfig("params.fxp.companion", 0);
+
+ currentState = DestSentStat;
+ socket()->protoStat(destinationFile);
+ return;
+ } else {
+ socket()->setConfig("params.transfer.mode", TransferPASV);
+
+ if (socket()->getCurrentDirectory() != sourceFile.directory()) {
+ // Attempt to CWD to the parent directory
+ currentState = SourceSentCwd;
+ socket()->sendCommand("CWD " + sourceFile.directory());
+ return;
+ }
+ }
+ }
+
+ // ***************************************************************************
+ // ***************************** Source socket *******************************
+ // ***************************************************************************
+ case SourceSentCwd: {
+ if (currentState == SourceSentCwd) {
+ if (!socket()->isResponse("250")) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ if (socket()->isMultiline())
+ return;
+ else
+ socket()->setCurrentDirectory(sourceFile.directory());
+ }
+
+ // We are the source socket, let's stat
+ currentState = SourceSentStat;
+ socket()->protoStat(sourceFile);
+ break;
+ }
+ case SourceSentStat: {
+ if (socket()->getStatResponse().filename().isEmpty()) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ } else {
+ // File exists, invoke the companion
+ companion->setConfig("params.fxp.companion", 1);
+ companion->thread()->siteToSite(socket()->thread(), sourceFile, destinationFile);
+ currentState = SourceDestVerified;
+ }
+ break;
+ }
+ case SourceDestVerified: {
+ if (isWakeup()) {
+ // We have been waken up because a decision has been made
+ FileExistsWakeupEvent *event = static_cast<FileExistsWakeupEvent*>(m_wakeupEvent);
+
+ if (!socket()->getConfigInt("feat.rest") && event->action == FileExistsWakeupEvent::Resume)
+ event->action = FileExistsWakeupEvent::Overwrite;
+
+ switch (event->action) {
+ case FileExistsWakeupEvent::Rename: {
+ // Change the destination filename, otherwise it is the same as overwrite
+ destinationFile.setPath(event->newFileName);
+ }
+ case FileExistsWakeupEvent::Overwrite: {
+ companion->setConfig("params.fxp.rest", 0);
+ resumeOffset = 0;
+ break;
+ }
+ case FileExistsWakeupEvent::Resume: {
+ companion->setConfig("params.fxp.rest", companion->getStatResponse().size());
+ resumeOffset = companion->getStatResponse().size();
+ break;
+ }
+ case FileExistsWakeupEvent::Skip: {
+ // Transfer should be aborted
+ companion->setConfig("params.fxp.keep_cache", 1);
+ socket()->setConfig("params.fxp.keep_cache", 1);
+
+ socket()->resetCommandClass(UserAbort);
+ socket()->emitEvent(Event::EventTransferComplete);
+ return;
+ }
+ }
+ } else {
+ companion->setConfig("params.fxp.rest", 0);
+ resumeOffset = 0;
+ }
+
+ // Change type
+ currentState = SourceSentType;
+
+ QString type = "TYPE ";
+ type.append(KFTPCore::Config::self()->ftpMode(sourceFile.path()));
+ socket()->sendCommand(type);
+ break;
+ }
+ case SourceSentType: {
+ if (socket()->getConfigInt("ssl") && socket()->getConfigInt("ssl.prot_mode") != 2 && !socket()->getConfigInt("sscn.activated")) {
+ if (socket()->getConfigInt("ssl.prot_mode") == 0) {
+ if (socket()->getConfigInt("feat.sscn")) {
+ // We support SSCN
+ currentState = SourceSentSscn;
+ socket()->sendCommand("SSCN ON");
+ companion->setConfig("params.ssl.mode", ProtPrivate);
+ } else if (companion->getConfigInt("feat.sscn")) {
+ // Companion supports SSCN
+ currentState = SourceWaitType;
+ companion->setConfig("params.ssl.mode", ProtSSCN);
+ companion->nextCommandAsync();
+ } else if (socket()->getConfigInt("feat.cpsv")) {
+ // We support CPSV
+ currentState = SourceWaitType;
+ socket()->setConfig("params.transfer.mode", TransferCPSV);
+ companion->setConfig("params.ssl.mode", ProtPrivate);
+ companion->nextCommandAsync();
+ } else {
+ // Neither support SSCN, can't do SSL transfer
+ socket()->emitEvent(Event::EventMessage, i18n("Neither server supports SSCN/CPSV but SSL data connection requested, aborting transfer!"));
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+ } else {
+ currentState = SourceSentProt;
+ socket()->sendCommand("PROT C");
+ companion->setConfig("params.ssl.mode", ProtClear);
+ }
+ } else {
+ currentState = SourceWaitType;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case SourceSentSscn: {
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ socket()->setConfig("sscn.activated", 1);
+ socket()->setConfig("params.fxp.changed_prot", 0);
+
+ currentState = SourceWaitType;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case SourceSentProt: {
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ socket()->setConfig("params.fxp.changed_prot", 1);
+
+ currentState = SourceWaitType;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case SourceWaitType: {
+ // We are ready to invoke file transfer, do PASV
+ if (socket()->getConfigInt("feat.pret")) {
+ currentState = SourceSentPret;
+ socket()->sendCommand("PRET RETR " + sourceFile.filename());
+ } else {
+ currentState = SourceSentPasv;
+
+ switch (socket()->getConfigInt("params.transfer.mode")) {
+ case TransferPASV: socket()->sendCommand("PASV"); break;
+ case TransferCPSV: socket()->sendCommand("CPSV"); break;
+ }
+ }
+ break;
+ }
+ case SourceSentPret: {
+ if (!socket()->isResponse("2")) {
+ if (socket()->isResponse("550")) {
+ socket()->emitError(PermissionDenied);
+ socket()->resetCommandClass(Failed);
+ return;
+ } else if (socket()->isResponse("530")) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ }
+
+ socket()->setConfig("feat.pret", 0);
+ }
+
+ currentState = SourceSentPasv;
+
+ switch (socket()->getConfigInt("params.transfer.mode")) {
+ case TransferPASV: socket()->sendCommand("PASV"); break;
+ case TransferCPSV: socket()->sendCommand("CPSV"); break;
+ }
+ break;
+ }
+ case SourceSentPasv: {
+ // Parse the PASV response and get it to the companion to issue PORT
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ QString tmp = socket()->getResponse();
+ int pos = tmp.find('(') + 1;
+ tmp = tmp.mid(pos, tmp.find(')') - pos);
+
+ currentState = SourceDoRest;
+ companion->setConfig("params.fxp.ip", tmp);
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case SourceDoRest: {
+ currentState = SourceSentRest;
+ socket()->sendCommand("REST " + QString::number(resumeOffset));
+ break;
+ }
+ case SourceSentRest: {
+ if (!socket()->isResponse("2") && !socket()->isResponse("3")) {
+ socket()->setConfig("feat.rest", 0);
+ companion->setConfig("params.fxp.rest", 0);
+ } else {
+ // Signal resume
+ socket()->emitEvent(Event::EventResumeOffset, resumeOffset);
+ }
+
+ currentState = SourceDoRetr;
+ companion->nextCommandAsync();
+ break;
+ }
+ case SourceDoRetr: {
+ currentState = SourceSentRetr;
+ socket()->sendCommand("RETR " + sourceFile.filename());
+ break;
+ }
+ case SourceSentRetr: {
+ if (!socket()->isResponse("1")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ currentState = SourceWaitTransfer;
+ }
+ break;
+ }
+ case SourceWaitTransfer: {
+ if (!socket()->isMultiline()) {
+ // Transfer has been completed
+ if (socket()->getConfigInt("params.fxp.changed_prot")) {
+ currentState = SourceResetProt;
+
+ QString prot = "PROT ";
+
+ if (socket()->getConfigInt("ssl.prot_mode") == 0)
+ prot.append('P');
+ else
+ prot.append('C');
+
+ socket()->sendCommand(prot);
+ } else {
+ markClean();
+
+ socket()->emitEvent(Event::EventMessage, i18n("Transfer completed."));
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ }
+ }
+ break;
+ }
+ case SourceResetProt: {
+ markClean();
+
+ socket()->emitEvent(Event::EventMessage, i18n("Transfer completed."));
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ break;
+ }
+
+ // ***************************************************************************
+ // *************************** Destination socket ****************************
+ // ***************************************************************************
+ case DestSentStat: {
+ if (socket()->getStatResponse().filename().isEmpty()) {
+ // Change the working directory
+ currentState = DestWaitCwd;
+ socket()->changeWorkingDirectory(destinationFile.directory(), true);
+ } else {
+ // The file already exists, request action
+ DirectoryListing list;
+ list.addEntry(companion->getStatResponse());
+ list.addEntry(socket()->getStatResponse());
+
+ currentState = DestDoType;
+ socket()->emitEvent(Event::EventFileExists, list);
+ }
+ break;
+ }
+ case DestWaitCwd: {
+ // Directory has been changed/created, call back the companion
+ currentState = DestDoType;
+ companion->nextCommandAsync();
+ break;
+ }
+ case DestDoType: {
+ currentState = DestSentType;
+
+ QString type = "TYPE ";
+ type.append(KFTPCore::Config::self()->ftpMode(sourceFile.path()));
+ socket()->sendCommand(type);
+ break;
+ }
+ case DestSentType: {
+ if (socket()->getConfigInt("ssl")) {
+ // Check what the source socket has instructed us to do
+ switch (socket()->getConfigInt("params.ssl.mode")) {
+ case ProtClear: {
+ // We should use cleartext data channel
+ if (socket()->getConfigInt("ssl.prot_mode") != 2) {
+ currentState = DestSentProt;
+ socket()->sendCommand("PROT C");
+ } else {
+ currentState = DestDoPort;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case ProtPrivate: {
+ // We should use private data channel
+ if (socket()->getConfigInt("ssl.prot_mode") != 0) {
+ currentState = DestSentProt;
+ socket()->sendCommand("PROT P");
+ } else {
+ currentState = DestDoPort;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case ProtSSCN: {
+ // We should initialize SSCN mode
+ if (!socket()->getConfigInt("sscn.activated")) {
+ currentState = DestSentSscn;
+ socket()->sendCommand("SSCN ON");
+ } else {
+ currentState = DestDoPort;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ }
+ } else {
+ currentState = DestDoPort;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case DestSentSscn: {
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ socket()->setConfig("sscn.activated", 1);
+ socket()->setConfig("params.fxp.changed_prot", 0);
+
+ currentState = DestDoPort;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case DestSentProt: {
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ socket()->setConfig("params.fxp.changed_prot", 1);
+
+ currentState = DestDoPort;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case DestDoPort: {
+ currentState = DestSentPort;
+ socket()->sendCommand("PORT " + socket()->getConfig("params.fxp.ip"));
+ break;
+ }
+ case DestSentPort: {
+ if (!socket()->isResponse("2")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ currentState = DestSentRest;
+ socket()->sendCommand("REST " + socket()->getConfig("params.fxp.rest"));
+ }
+ break;
+ }
+ case DestSentRest: {
+ // We are ready for file transfer
+ currentState = DestDoStor;
+ companion->nextCommandAsync();
+ break;
+ }
+ case DestDoStor: {
+ currentState = DestSentStor;
+ socket()->sendCommand("STOR " + destinationFile.filename());
+ break;
+ }
+ case DestSentStor: {
+ if (!socket()->isResponse("1")) {
+ socket()->resetCommandClass(Failed);
+ } else {
+ currentState = DestWaitTransfer;
+ companion->nextCommandAsync();
+ }
+ break;
+ }
+ case DestWaitTransfer: {
+ if (!socket()->isMultiline()) {
+ // Transfer has been completed
+ if (socket()->getConfigInt("params.fxp.changed_prot")) {
+ currentState = DestResetProt;
+
+ QString prot = "PROT ";
+
+ if (socket()->getConfigInt("ssl.prot_mode") == 0)
+ prot.append('P');
+ else
+ prot.append('C');
+
+ socket()->sendCommand(prot);
+ } else {
+ markClean();
+
+ socket()->emitEvent(Event::EventMessage, i18n("Transfer completed."));
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ }
+ }
+ break;
+ }
+ case DestResetProt: {
+ markClean();
+
+ socket()->emitEvent(Event::EventMessage, i18n("Transfer completed."));
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoSiteToSite(Socket *socket, const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Transfering..."));
+ emitEvent(Event::EventMessage, i18n("Transfering file '%1'...").arg(source.fileName()));
+
+ // Set the source and destination
+ setConfig("params.fxp.abort", 0);
+ setConfig("params.fxp.source", source.path());
+ setConfig("params.fxp.destination", destination.path());
+
+ FtpCommandFxp *fxp = new FtpCommandFxp(this);
+ fxp->companion = static_cast<FtpSocket*>(socket);
+ m_cmdData = fxp;
+ m_cmdData->process();
+}
+
+// *******************************************************************************************
+// ******************************************* NOOP ******************************************
+// *******************************************************************************************
+
+class FtpCommandKeepAlive : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentNoop
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandKeepAlive, FtpSocket, CmdKeepAlive)
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ currentState = SentNoop;
+ socket()->sendCommand("NOOP");
+ break;
+ }
+ case SentNoop: {
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void FtpSocket::protoKeepAlive()
+{
+ emitEvent(Event::EventState, i18n("Transmitting keep-alive..."));
+ setCurrentCommand(Commands::CmdKeepAlive);
+ activateCommandClass(FtpCommandKeepAlive);
+}
+
+}
diff --git a/kftpgrabber/src/engine/ftpsocket.h b/kftpgrabber/src/engine/ftpsocket.h
new file mode 100644
index 0000000..1762bfd
--- /dev/null
+++ b/kftpgrabber/src/engine/ftpsocket.h
@@ -0,0 +1,154 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPENGINEFTPSOCKET_H
+#define KFTPENGINEFTPSOCKET_H
+
+#include <kstreamsocket.h>
+#include <kserversocket.h>
+#include <kssl.h>
+
+#include <qguardedptr.h>
+#include <qfile.h>
+
+#include "speedlimiter.h"
+#include "socket.h"
+
+namespace KFTPEngine {
+
+class FtpDirectoryParser;
+class Ssl;
+
+/**
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class FtpSocket : public KNetwork::KStreamSocket, public Socket, public SpeedLimiterItem
+{
+Q_OBJECT
+friend class Commands::Base;
+friend class FtpCommandConnect;
+friend class FtpCommandNegotiateData;
+friend class FtpCommandList;
+public:
+ FtpSocket(Thread *thread);
+ ~FtpSocket();
+
+ void protoConnect(const KURL &url);
+ void protoDisconnect();
+ void protoAbort();
+ void protoGet(const KURL &source, const KURL &destination);
+ void protoPut(const KURL &source, const KURL &destination);
+ void protoRemove(const KURL &path);
+ void protoRename(const KURL &source, const KURL &destination);
+ void protoChmodSingle(const KURL &path, int mode);
+ void protoMkdir(const KURL &path);
+ void protoList(const KURL &path);
+ void protoRaw(const QString &raw);
+ void protoSiteToSite(Socket *socket, const KURL &source, const KURL &destination);
+ void protoKeepAlive();
+
+ void changeWorkingDirectory(const QString &path, bool shouldCreate = false);
+
+ void poll();
+
+ int features() { return SF_FXP_TRANSFER | SF_RAW_COMMAND; }
+
+ bool isConnected() { return m_login; }
+ bool isEncrypted() { return isConnected() && getConfigInt("ssl"); }
+
+ void setSslClientCertificate(KSSLPKCS12 *certificate) { m_clientCert = certificate; }
+
+ bool isResponse(const QString &code);
+ QString getResponse() { return m_response; }
+ bool isMultiline() { return !m_multiLineCode.isEmpty(); }
+
+ void sendCommand(const QString &command);
+ void resetCommandClass(ResetCode code = Ok);
+
+ void setupPassiveTransferSocket(const QString &host, int port);
+ KNetwork::KSocketAddress setupActiveTransferSocket();
+
+ QFile *getTransferFile() { return &m_transferFile; }
+
+ void checkTransferEnd();
+ void checkTransferStart();
+ void resetTransferStart() { m_transferStart = 0; }
+protected:
+ void processBuffer();
+ void parseLine(const QString &line);
+ void variableBufferUpdate(Q_LONG size);
+ void closeDataTransferSocket();
+ void initializeTransferSocket();
+ void transferCompleted();
+private:
+ bool m_login;
+
+ QString m_buffer;
+ QString m_multiLineCode;
+ QString m_response;
+
+ QGuardedPtr<KNetwork::KStreamSocket> m_transferSocket;
+ QGuardedPtr<KNetwork::KServerSocket> m_serverSocket;
+ FtpDirectoryParser *m_directoryParser;
+
+ char m_controlBuffer[1024];
+
+ QFile m_transferFile;
+ char *m_transferBuffer;
+ int m_transferBufferSize;
+ int m_transferStart;
+ int m_transferEnd;
+
+ bool m_transferConnecting;
+ bool m_controlConnecting;
+
+ Ssl *m_controlSsl;
+ Ssl *m_dataSsl;
+ KSSLPKCS12 *m_clientCert;
+protected slots:
+ void slotConnected();
+ void slotControlTryRead();
+ void slotError();
+
+ void slotDataAccept(KNetwork::KStreamSocket *socket);
+ void slotDataConnected();
+ void slotDataTryRead();
+ void slotDataTryWrite();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/sftpsocket.cpp b/kftpgrabber/src/engine/sftpsocket.cpp
new file mode 100644
index 0000000..a683723
--- /dev/null
+++ b/kftpgrabber/src/engine/sftpsocket.cpp
@@ -0,0 +1,775 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "sftpsocket.h"
+#include "cache.h"
+#include "misc/config.h"
+
+#include <qdir.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kio/job.h>
+#include <kio/renamedlg.h>
+
+#include <sys/stat.h>
+#include <fcntl.h>
+
+namespace KFTPEngine {
+
+SftpSocket::SftpSocket(Thread *thread)
+ : Socket(thread, "sftp"),
+ m_login(false)
+{
+}
+
+SftpSocket::~SftpSocket()
+{
+}
+
+int addPermInt(int &x, int n, int add)
+{
+ if (x >= n) {
+ x -= n;
+ return add;
+ } else {
+ return 0;
+ }
+}
+
+int SftpSocket::intToPosix(int permissions)
+{
+ int posix = 0;
+ QString str = QString::number(permissions);
+
+ int user = str.mid(0, 1).toInt();
+ int group = str.mid(1, 1).toInt();
+ int other = str.mid(2, 1).toInt();
+
+ posix |= addPermInt(user, 4, S_IRUSR);
+ posix |= addPermInt(user, 2, S_IWUSR);
+ posix |= addPermInt(user, 1, S_IXUSR);
+
+ posix |= addPermInt(group, 4, S_IRGRP);
+ posix |= addPermInt(group, 2, S_IWGRP);
+ posix |= addPermInt(group, 1, S_IXGRP);
+
+ posix |= addPermInt(other, 4, S_IROTH);
+ posix |= addPermInt(other, 2, S_IWOTH);
+ posix |= addPermInt(other, 1, S_IXOTH);
+
+ return posix;
+}
+
+
+// *******************************************************************************************
+// ***************************************** CONNECT *****************************************
+// *******************************************************************************************
+
+class SftpCommandConnect : public Commands::Base {
+public:
+ enum State {
+ None,
+ ConnectComplete,
+ LoginComplete
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(SftpCommandConnect, SftpSocket, CmdConnect)
+
+ void process()
+ {
+ KURL url = socket()->getCurrentUrl();
+
+ switch (currentState) {
+ case None: {
+ // Set connection info
+ SSH_OPTIONS *sshOptions = options_new();
+ options_set_username(sshOptions, (char*) url.user().ascii());
+ options_set_host(sshOptions, url.host().ascii());
+ options_set_port(sshOptions, url.port());
+ options_set_timeout(sshOptions, 10, 0);
+
+ socket()->m_sftpSession = 0;
+ socket()->m_sshSession = ssh_connect(sshOptions);
+
+ if (!socket()->sshSession()) {
+ socket()->emitEvent(Event::EventMessage, i18n("Unable to establish SSH connection (%1)").arg(ssh_get_error(0)));
+ socket()->emitError(ConnectFailed);
+ return;
+ }
+
+ socket()->emitEvent(Event::EventState, i18n("Logging in..."));
+ socket()->emitEvent(Event::EventMessage, i18n("Connected with server, attempting to login..."));
+
+ currentState = ConnectComplete;
+ }
+ case ConnectComplete: {
+ SSH_SESSION *sshSession = socket()->sshSession();
+ QString password;
+
+ // Check if a public key password was supplied using the wakeup event
+ if (isWakeup()) {
+ PubkeyWakeupEvent *event = static_cast<PubkeyWakeupEvent*>(m_wakeupEvent);
+ password = event->password;
+ }
+
+ // Try the public key auth with the set password (if any)
+ int pkey_ret = ssh_userauth_autopubkey(sshSession, (char*) password.ascii());
+ if (pkey_ret == -666) {
+ // Make a password request
+ socket()->emitEvent(Event::EventPubkeyPassword);
+ return;
+ } else if (pkey_ret != SSH_AUTH_SUCCESS) {
+ // First let's try the keyboard-interactive authentification
+ if (keyboardInteractiveLogin() != SSH_AUTH_SUCCESS) {
+ // If this fails, let's try the password authentification
+ if (ssh_userauth_password(sshSession, NULL, (char*) url.pass().ascii()) != SSH_AUTH_SUCCESS) {
+ socket()->emitEvent(Event::EventMessage, i18n("Login has failed."));
+ socket()->emitError(LoginFailed);
+
+ socket()->protoAbort();
+ return;
+ }
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("Keyboard-interactive authentication succeeded."));
+ }
+ } else {
+ socket()->emitEvent(Event::EventMessage, i18n("Public key authentication succeeded."));
+ }
+
+ currentState = LoginComplete;
+ }
+ case LoginComplete: {
+ socket()->m_sftpSession = sftp_new(socket()->sshSession());
+
+ if (!socket()->sftpSession()) {
+ socket()->emitEvent(Event::EventMessage, i18n("Unable to initialize SFTP channel."));
+ socket()->emitError(LoginFailed);
+
+ socket()->protoAbort();
+ return;
+ }
+
+ if (sftp_init(socket()->sftpSession())) {
+ socket()->emitEvent(Event::EventMessage, i18n("Unable to initialize SFTP."));
+ socket()->emitError(LoginFailed);
+
+ socket()->protoAbort();
+ return;
+ }
+
+ // Get the current directory
+ char *cwd = sftp_canonicalize_path(socket()->sftpSession(), "./");
+ socket()->setDefaultDirectory(socket()->remoteEncoding()->decode(cwd));
+ socket()->setCurrentDirectory(socket()->remoteEncoding()->decode(cwd));
+ delete cwd;
+
+ socket()->emitEvent(Event::EventMessage, i18n("Connected."));
+ socket()->emitEvent(Event::EventConnect);
+ socket()->m_login = true;
+
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+
+ int keyboardInteractiveLogin()
+ {
+ int err = ssh_userauth_kbdint(socket()->sshSession(), NULL, NULL);
+ char *name, *instruction, *prompt;
+ int i, n;
+ char echo;
+
+ while (err == SSH_AUTH_INFO) {
+ name = ssh_userauth_kbdint_getname(socket()->sshSession());
+ instruction = ssh_userauth_kbdint_getinstruction(socket()->sshSession());
+ n = ssh_userauth_kbdint_getnprompts(socket()->sshSession());
+
+ // FIXME Name and instruction are currently ignored. The libssh API reference
+ // suggests displaying an interactive dialog box for the user to supply the
+ // information requested from the server.
+
+ for(i = 0; i < n; ++i) {
+ prompt = ssh_userauth_kbdint_getprompt(socket()->sshSession(), i, &echo);
+
+ if (!echo) {
+ // We should send the password (since only the password should be masked)
+ ssh_userauth_kbdint_setanswer(socket()->sshSession(), i, (char*) socket()->getCurrentUrl().pass().ascii());
+ } else {
+ // FIXME Server requests something else ?
+ }
+ }
+
+ err = ssh_userauth_kbdint(socket()->sshSession(), NULL, NULL);
+ }
+
+ return err;
+ }
+};
+
+void SftpSocket::protoConnect(const KURL &url)
+{
+ emitEvent(Event::EventState, i18n("Connecting..."));
+ emitEvent(Event::EventMessage, i18n("Connecting to %1:%2...").arg(url.host()).arg(url.port()));
+
+ if (!getConfig("encoding").isEmpty())
+ changeEncoding(getConfig("encoding"));
+
+ // Connect to the remote host
+ setCurrentUrl(url);
+ activateCommandClass(SftpCommandConnect);
+}
+
+// *******************************************************************************************
+// **************************************** DISCONNECT ***************************************
+// *******************************************************************************************
+
+void SftpSocket::protoDisconnect()
+{
+ Socket::protoDisconnect();
+
+ if (m_sftpSession)
+ sftp_free(m_sftpSession);
+
+ ssh_disconnect(m_sshSession);
+ m_sshSession = 0;
+
+ m_login = false;
+}
+
+void SftpSocket::protoAbort()
+{
+ Socket::protoAbort();
+
+ if (getCurrentCommand() == Commands::CmdGet || getCurrentCommand() == Commands::CmdPut) {
+ // Abort current command
+ resetCommandClass(UserAbort);
+ emitEvent(Event::EventMessage, i18n("Aborted."));
+ }
+}
+
+// *******************************************************************************************
+// ******************************************* LIST ******************************************
+// *******************************************************************************************
+
+class SftpCommandList : public Commands::Base {
+public:
+ enum State {
+ None
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(SftpCommandList, SftpSocket, CmdList)
+
+ void process()
+ {
+ // Check the directory listing cache
+ DirectoryListing cached = Cache::self()->findCached(socket(), socket()->getCurrentDirectory());
+ if (cached.isValid()) {
+ socket()->emitEvent(Event::EventMessage, i18n("Using cached directory listing."));
+
+ if (socket()->isChained()) {
+ // We don't emit an event, because this list has been called from another
+ // command. Just save the listing.
+ socket()->m_lastDirectoryListing = cached;
+ } else
+ socket()->emitEvent(Event::EventDirectoryListing, cached);
+
+ socket()->resetCommandClass();
+ return;
+ }
+
+ socket()->m_lastDirectoryListing = DirectoryListing(socket()->getCurrentDirectory());
+
+ SFTP_DIR *m_dir = sftp_opendir(socket()->sftpSession(), socket()->remoteEncoding()->encode(socket()->getCurrentDirectory()).data());
+ if (!m_dir) {
+ if (socket()->errorReporting()) {
+ socket()->emitError(ListFailed);
+ socket()->resetCommandClass(Failed);
+ } else
+ socket()->resetCommandClass();
+ return;
+ }
+
+ // Read the specified directory
+ SFTP_ATTRIBUTES *file;
+ DirectoryEntry entry;
+
+ while ((file = sftp_readdir(socket()->sftpSession(), m_dir))) {
+ entry.setFilename(file->name);
+
+ if (entry.filename() != "." && entry.filename() != "..") {
+ entry.setFilename(socket()->remoteEncoding()->decode(entry.filename().ascii()));
+ entry.setOwner(file->owner);
+ entry.setGroup(file->group);
+ entry.setTime(file->mtime);
+ entry.setSize(file->size);
+ entry.setPermissions(file->permissions);
+
+ if (file->permissions & S_IFDIR)
+ entry.setType('d');
+ else
+ entry.setType('f');
+
+ socket()->m_lastDirectoryListing.addEntry(entry);
+ }
+
+ sftp_attributes_free(file);
+ }
+
+ sftp_dir_close(m_dir);
+
+ // Cache the directory listing
+ Cache::self()->addDirectory(socket(), socket()->m_lastDirectoryListing);
+
+ if (!socket()->isChained())
+ socket()->emitEvent(Event::EventDirectoryListing, socket()->m_lastDirectoryListing);
+ socket()->resetCommandClass();
+ }
+};
+
+void SftpSocket::protoList(const KURL &path)
+{
+ emitEvent(Event::EventState, i18n("Fetching directory listing..."));
+ emitEvent(Event::EventMessage, i18n("Fetching directory listing..."));
+
+ // Set the directory that should be listed
+ setCurrentDirectory(path.path());
+
+ activateCommandClass(SftpCommandList);
+}
+
+// *******************************************************************************************
+// ******************************************* GET *******************************************
+// *******************************************************************************************
+
+class SftpCommandGet : public Commands::Base {
+public:
+ enum State {
+ None,
+ WaitStat,
+ DestChecked
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(SftpCommandGet, SftpSocket, CmdGet)
+
+ KURL sourceFile;
+ KURL destinationFile;
+ filesize_t resumeOffset;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ // Stat source file
+ resumeOffset = 0;
+ sourceFile.setPath(socket()->getConfig("params.get.source"));
+ destinationFile.setPath(socket()->getConfig("params.get.destination"));
+
+ currentState = WaitStat;
+ socket()->protoStat(sourceFile);
+ break;
+ }
+ case WaitStat: {
+ socket()->emitEvent(Event::EventState, i18n("Transfering..."));
+
+ if (socket()->getStatResponse().filename().isEmpty()) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ if (QDir::root().exists(destinationFile.path())) {
+ DirectoryListing list;
+ list.addEntry(socket()->getStatResponse());
+
+ currentState = DestChecked;
+ socket()->emitEvent(Event::EventFileExists, list);
+ return;
+ } else
+ KStandardDirs::makeDir(destinationFile.directory());
+ }
+ case DestChecked: {
+ QFile file;
+
+ if (isWakeup()) {
+ // We have been waken up because a decision has been made
+ FileExistsWakeupEvent *event = static_cast<FileExistsWakeupEvent*>(m_wakeupEvent);
+
+ switch (event->action) {
+ case FileExistsWakeupEvent::Rename: {
+ // Change the destination filename, otherwise it is the same as overwrite
+ destinationFile.setPath(event->newFileName);
+ }
+ case FileExistsWakeupEvent::Overwrite: {
+ file.setName(destinationFile.path());
+ file.open(IO_WriteOnly | IO_Truncate);
+ break;
+ }
+ case FileExistsWakeupEvent::Resume: {
+ file.setName(destinationFile.path());
+ file.open(IO_WriteOnly | IO_Append);
+
+ // Signal resume
+ resumeOffset = file.size();
+ socket()->emitEvent(Event::EventResumeOffset, resumeOffset);
+ break;
+ }
+ case FileExistsWakeupEvent::Skip: {
+ // Transfer should be aborted
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ return;
+ }
+ }
+ } else {
+ // The file doesn't exist so we are free to overwrite
+ file.setName(destinationFile.path());
+ file.open(IO_WriteOnly | IO_Truncate);
+ }
+
+ // Download the file
+ SFTP_FILE *rfile = sftp_open(socket()->sftpSession(), socket()->remoteEncoding()->encode(sourceFile.path()).data(), O_RDONLY, 0);
+ if (!rfile) {
+ file.close();
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ if (resumeOffset > 0)
+ sftp_seek(rfile, resumeOffset);
+
+ char buffer[16384];
+ int size;
+
+ do {
+ size = sftp_read(rfile, buffer, sizeof(buffer));
+
+ if (size > 0) {
+ file.writeBlock(buffer, size);
+ socket()->m_transferBytes += size;
+ }
+
+ if (socket()->shouldAbort())
+ break;
+ } while (size);
+
+ sftp_file_close(rfile);
+ file.close();
+
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void SftpSocket::protoGet(const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Transfering..."));
+ emitEvent(Event::EventMessage, i18n("Downloading file '%1'...").arg(source.fileName()));
+
+ // Set the source and destination
+ setConfig("params.get.source", source.path());
+ setConfig("params.get.destination", destination.path());
+
+ m_transferBytes = 0;
+
+ m_speedLastTime = time(0);
+ m_speedLastBytes = 0;
+
+ activateCommandClass(SftpCommandGet);
+}
+
+// *******************************************************************************************
+// ******************************************* PUT *******************************************
+// *******************************************************************************************
+
+class SftpCommandPut : public Commands::Base {
+public:
+ enum State {
+ None,
+ WaitStat,
+ DestChecked
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(SftpCommandPut, SftpSocket, CmdPut)
+
+ KURL sourceFile;
+ KURL destinationFile;
+ filesize_t resumeOffset;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ // Stat source file
+ resumeOffset = 0;
+ sourceFile.setPath(socket()->getConfig("params.get.source"));
+ destinationFile.setPath(socket()->getConfig("params.get.destination"));
+
+ if (!QDir::root().exists(sourceFile.path())) {
+ socket()->emitError(FileNotFound);
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ currentState = WaitStat;
+ socket()->protoStat(destinationFile);
+ break;
+ }
+ case WaitStat: {
+ socket()->emitEvent(Event::EventState, i18n("Transfering..."));
+
+ if (!socket()->getStatResponse().filename().isEmpty()) {
+ DirectoryListing list;
+ list.addEntry(socket()->getStatResponse());
+
+ currentState = DestChecked;
+ socket()->emitEvent(Event::EventFileExists, list);
+ return;
+ } else {
+ // Create destination directories
+ socket()->setErrorReporting(false);
+
+ QString destinationDir = destinationFile.directory();
+ QString fullPath;
+
+ for (register int i = 1; i <= destinationDir.contains('/'); i++) {
+ fullPath += "/" + destinationDir.section('/', i, i);
+
+ // Create the directory
+ socket()->protoMkdir(fullPath);
+ }
+ }
+ }
+ case DestChecked: {
+ QFile file;
+
+ if (isWakeup()) {
+ // We have been waken up because a decision has been made
+ FileExistsWakeupEvent *event = static_cast<FileExistsWakeupEvent*>(m_wakeupEvent);
+
+ switch (event->action) {
+ case FileExistsWakeupEvent::Rename: {
+ // Change the destination filename, otherwise it is the same as overwrite
+ destinationFile.setPath(event->newFileName);
+ }
+ case FileExistsWakeupEvent::Overwrite: {
+ file.setName(sourceFile.path());
+ file.open(IO_ReadOnly);
+ break;
+ }
+ case FileExistsWakeupEvent::Resume: {
+ resumeOffset = socket()->getStatResponse().size();
+
+ file.setName(sourceFile.path());
+ file.open(IO_ReadOnly);
+ file.at(resumeOffset);
+
+ // Signal resume
+ socket()->emitEvent(Event::EventResumeOffset, resumeOffset);
+ break;
+ }
+ case FileExistsWakeupEvent::Skip: {
+ // Transfer should be aborted
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ return;
+ }
+ }
+ } else {
+ // The file doesn't exist so we are free to overwrite
+ file.setName(sourceFile.path());
+ file.open(IO_ReadOnly);
+ }
+
+ // Download the file
+ SFTP_FILE *rfile;
+
+ if (resumeOffset > 0) {
+ rfile = sftp_open(socket()->sftpSession(), socket()->remoteEncoding()->encode(destinationFile.path()).data(), O_WRONLY | O_APPEND, 0);
+ sftp_seek(rfile, resumeOffset);
+ } else
+ rfile = sftp_open(socket()->sftpSession(), socket()->remoteEncoding()->encode(destinationFile.path()).data(), O_WRONLY | O_CREAT, 0);
+
+ if (!rfile) {
+ file.close();
+ socket()->resetCommandClass(Failed);
+ return;
+ }
+
+ char buffer[16384];
+ int size;
+
+ do {
+ size = file.readBlock(buffer, sizeof(buffer));
+
+ if (size > 0) {
+ sftp_write(rfile, buffer, size);
+ socket()->m_transferBytes += size;
+ }
+
+ if (socket()->shouldAbort())
+ break;
+ } while (size);
+
+ sftp_file_close(rfile);
+ file.close();
+
+ socket()->emitEvent(Event::EventTransferComplete);
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void SftpSocket::protoPut(const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Transfering..."));
+ emitEvent(Event::EventMessage, i18n("Uploading file '%1'...").arg(source.fileName()));
+
+ // Set the source and destination
+ setConfig("params.get.source", source.path());
+ setConfig("params.get.destination", destination.path());
+
+ m_transferBytes = 0;
+
+ m_speedLastTime = time(0);
+ m_speedLastBytes = 0;
+
+ activateCommandClass(SftpCommandPut);
+}
+
+// *******************************************************************************************
+// **************************************** REMOVE *******************************************
+// *******************************************************************************************
+
+void SftpSocket::protoRemove(const KURL &path)
+{
+ emitEvent(Event::EventState, i18n("Removing..."));
+
+ // Remove a file or directory
+ int result = 0;
+
+ if (getConfigInt("params.remove.directory"))
+ result = sftp_rmdir(m_sftpSession, remoteEncoding()->encode(path.path()).data());
+ else
+ result = sftp_rm(m_sftpSession, remoteEncoding()->encode(path.path()).data());
+
+ if (result < 0) {
+ resetCommandClass(Failed);
+ } else {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(this, path.directory());
+
+ emitEvent(Event::EventReloadNeeded);
+ resetCommandClass();
+ }
+}
+
+// *******************************************************************************************
+// **************************************** RENAME *******************************************
+// *******************************************************************************************
+
+void SftpSocket::protoRename(const KURL &source, const KURL &destination)
+{
+ emitEvent(Event::EventState, i18n("Renaming..."));
+
+ if (sftp_rename(m_sftpSession, remoteEncoding()->encode(source.path()).data(), remoteEncoding()->encode(destination.path()).data()) < 0) {
+ resetCommandClass(Failed);
+ } else {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(this, source.directory());
+ Cache::self()->invalidateEntry(this, destination.directory());
+
+ emitEvent(Event::EventReloadNeeded);
+ resetCommandClass();
+ }
+}
+
+// *******************************************************************************************
+// **************************************** CHMOD ********************************************
+// *******************************************************************************************
+
+void SftpSocket::protoChmodSingle(const KURL &path, int mode)
+{
+ emitEvent(Event::EventState, i18n("Changing mode..."));
+
+ SFTP_ATTRIBUTES *attrs = static_cast<SFTP_ATTRIBUTES*>(new SFTP_ATTRIBUTES);
+ memset(attrs, 0, sizeof(*attrs));
+
+ attrs->permissions = intToPosix(mode);
+ attrs->flags = SSH_FILEXFER_ATTR_PERMISSIONS;
+
+ sftp_setstat(m_sftpSession, remoteEncoding()->encode(path.path()).data(), attrs);
+ sftp_attributes_free(attrs);
+
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(this, path.directory());
+
+ emitEvent(Event::EventReloadNeeded);
+ resetCommandClass();
+}
+
+// *******************************************************************************************
+// **************************************** MKDIR ********************************************
+// *******************************************************************************************
+
+void SftpSocket::protoMkdir(const KURL &path)
+{
+ SFTP_ATTRIBUTES *attrs = static_cast<SFTP_ATTRIBUTES*>(new SFTP_ATTRIBUTES);
+ memset(attrs, 0, sizeof(*attrs));
+
+ if (sftp_mkdir(m_sftpSession, remoteEncoding()->encode(path.path()).data(), attrs) < 0) {
+ if (errorReporting())
+ resetCommandClass(Failed);
+ } else {
+ // Invalidate cached parent entry (if any)
+ Cache::self()->invalidateEntry(this, path.directory());
+
+ if (errorReporting()) {
+ emitEvent(Event::EventReloadNeeded);
+ resetCommandClass();
+ }
+ }
+
+ delete attrs;
+}
+
+}
diff --git a/kftpgrabber/src/engine/sftpsocket.h b/kftpgrabber/src/engine/sftpsocket.h
new file mode 100644
index 0000000..f34a896
--- /dev/null
+++ b/kftpgrabber/src/engine/sftpsocket.h
@@ -0,0 +1,92 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPENGINESFTPSOCKET_H
+#define KFTPENGINESFTPSOCKET_H
+
+// LibSSH includes
+#include "misc/libs/ssh/libssh.h"
+#include "misc/libs/ssh/sftp.h"
+
+#include "socket.h"
+
+namespace KFTPEngine {
+
+/**
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class SftpSocket : public Socket {
+friend class SftpCommandConnect;
+friend class SftpCommandList;
+friend class SftpCommandGet;
+friend class SftpCommandPut;
+public:
+ SftpSocket(Thread *thread);
+ ~SftpSocket();
+
+ void protoConnect(const KURL &url);
+ void protoDisconnect();
+ void protoAbort();
+ void protoGet(const KURL &source, const KURL &destination);
+ void protoPut(const KURL &source, const KURL &destination);
+ void protoRemove(const KURL &path);
+ void protoRename(const KURL &source, const KURL &destination);
+ void protoChmodSingle(const KURL &path, int mode);
+ void protoMkdir(const KURL &path);
+ void protoList(const KURL &path);
+
+ void poll() {};
+
+ int features() { return 0; }
+
+ bool isConnected() { return m_login; }
+ bool isEncrypted() { return true; }
+
+ SSH_SESSION *sshSession() { return m_sshSession; }
+ SFTP_SESSION *sftpSession() { return m_sftpSession; }
+private:
+ QString posixToString(int permissions);
+ int intToPosix(int permissions);
+private:
+ SSH_SESSION *m_sshSession;
+ SFTP_SESSION *m_sftpSession;
+
+ bool m_login;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/socket.cpp b/kftpgrabber/src/engine/socket.cpp
new file mode 100644
index 0000000..370de1b
--- /dev/null
+++ b/kftpgrabber/src/engine/socket.cpp
@@ -0,0 +1,866 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "socket.h"
+#include "thread.h"
+#include "connectionretry.h"
+#include "speedlimiter.h"
+#include "cache.h"
+
+#include "misc/config.h"
+
+#include <klocale.h>
+
+namespace KFTPEngine {
+
+Socket::Socket(Thread *thread, const QString &protocol)
+ : m_remoteEncoding(new KRemoteEncoding()),
+ m_cmdData(0),
+ m_thread(thread),
+ m_transferBytes(0),
+ m_speedLastTime(0),
+ m_speedLastBytes(0),
+ m_protocol(protocol),
+ m_currentCommand(Commands::CmdNone),
+ m_errorReporting(true),
+ m_shouldAbort(false)
+{
+ m_commandChain.setAutoDelete(true);
+}
+
+Socket::~Socket()
+{
+ delete m_remoteEncoding;
+
+ if (m_connectionRetry)
+ delete m_connectionRetry;
+}
+
+void Socket::initConfig()
+{
+ m_config.clear();
+
+ // Fill in some default values
+ setConfig("feat.epsv", 1);
+ setConfig("feat.eprt", 1);
+ setConfig("feat.pasv", 1);
+ setConfig("feat.size", 1);
+ setConfig("ssl.prot_mode", 2);
+ setConfig("keepalive.enabled", 1);
+ setConfig("keepalive.timeout", 60);
+}
+
+void Socket::emitError(ErrorCode code, const QString &param1)
+{
+ // Intercept connect and login errors and pass them on to the ConnectionRetry class (if enabled)
+ if (getConfigInt("retry") && (code == ConnectFailed || code == LoginFailed)) {
+ if (!m_connectionRetry)
+ m_connectionRetry = new ConnectionRetry(this);
+
+ m_connectionRetry->startRetry();
+ return;
+ }
+
+ QValueList<EventParameter> params;
+ params.append(EventParameter(code));
+ params.append(EventParameter(param1));
+
+ // Dispatch the event via socket thread
+ m_thread->event(Event::EventError, params);
+}
+
+void Socket::emitEvent(Event::Type type, const QString &param1, const QString &param2)
+{
+ QValueList<EventParameter> params;
+ params.append(EventParameter(param1));
+ params.append(EventParameter(param2));
+
+ // Dispatch the event via socket thread
+ m_thread->event(type, params);
+}
+
+void Socket::emitEvent(Event::Type type, DirectoryListing param1)
+{
+ QValueList<EventParameter> params;
+ params.append(EventParameter(param1));
+
+ // Dispatch the event via socket thread
+ m_thread->event(type, params);
+}
+
+void Socket::emitEvent(Event::Type type, filesize_t param1)
+{
+ QValueList<EventParameter> params;
+ params.append(EventParameter(param1));
+
+ // Dispatch the event via socket thread
+ m_thread->event(type, params);
+}
+
+void Socket::emitEvent(Event::Type type, void *param1)
+{
+ QValueList<EventParameter> params;
+ params.append(EventParameter(param1));
+
+ // Dispatch the event via socket thread
+ m_thread->event(type, params);
+}
+
+void Socket::changeEncoding(const QString &encoding)
+{
+ // Alter encoding and change socket config
+ m_remoteEncoding->setEncoding(encoding.ascii());
+ setConfig("encoding", encoding);
+}
+
+void Socket::protoDisconnect()
+{
+ resetCommandClass(UserAbort);
+
+ emitEvent(Event::EventMessage, i18n("Disconnected."));
+ emitEvent(Event::EventDisconnect);
+}
+
+void Socket::timeoutWait(bool start)
+{
+ if (start) {
+ m_timeoutCounter.start();
+ } else {
+ m_timeoutCounter = QTime();
+ }
+}
+
+void Socket::timeoutPing()
+{
+ m_timeoutCounter.restart();
+}
+
+void Socket::timeoutCheck()
+{
+ if (!isConnected())
+ return;
+
+ if (!m_timeoutCounter.isNull()) {
+ Commands::Type command = getCurrentCommand();
+ int timeout = 0;
+
+ // Ignore timeouts for FXP transfers, since there is no way to do pings
+ if (command == Commands::CmdFxp)
+ return;
+
+ if (command == Commands::CmdGet || command == Commands::CmdPut)
+ timeout = KFTPCore::Config::dataTimeout();
+ else
+ timeout = KFTPCore::Config::controlTimeout();
+
+ if (timeout > 0 && m_timeoutCounter.elapsed() > (timeout * 1000)) {
+ timeoutWait(false);
+
+ // We have a timeout, let's abort
+ emitEvent(Event::EventMessage, i18n("Connection timed out."));
+ protoDisconnect();
+ }
+ }
+}
+
+void Socket::keepaliveStart()
+{
+ m_keepaliveCounter.start();
+}
+
+void Socket::keepaliveCheck()
+{
+ // Ignore keepalive if the socket is busy
+ if (isBusy() || !isConnected()) {
+ m_keepaliveCounter.restart();
+ return;
+ }
+
+ if (getConfigInt("keepalive.enabled") && m_keepaliveCounter.elapsed() > getConfigInt("keepalive.timeout") * 1000) {
+ protoKeepAlive();
+
+ // Reset the counter
+ m_keepaliveCounter.restart();
+ }
+}
+
+Commands::Type Socket::getCurrentCommand()
+{
+ if (m_commandChain.count() > 0) {
+ QPtrList<Commands::Base>::iterator chainEnd = m_commandChain.end();
+ for (QPtrList<Commands::Base>::iterator i = m_commandChain.begin(); i != chainEnd; i++) {
+ if ((*i)->command() != Commands::CmdNone)
+ return (*i)->command();
+ }
+ }
+
+ return m_currentCommand;
+}
+
+Commands::Type Socket::getToplevelCommand()
+{
+ return m_currentCommand;
+}
+
+Commands::Type Socket::getPreviousCommand()
+{
+ if (!isChained())
+ return Commands::CmdNone;
+
+ if (m_commandChain.count() > 1) {
+ Commands::Base *previous = m_commandChain.prev();
+ m_commandChain.next();
+
+ return previous->command();
+ } else {
+ return m_currentCommand;
+ }
+}
+
+void Socket::resetCommandClass(ResetCode code)
+{
+ if (m_commandChain.count() > 0) {
+ Commands::Base *current = m_commandChain.current();
+
+ if (current->isProcessing()) {
+ current->autoDestruct(code);
+ return;
+ } else {
+ if (!current->isClean())
+ current->cleanup();
+
+ m_commandChain.remove();
+ }
+
+ if (code == Ok) {
+ nextCommandAsync();
+ } else {
+ // Command has completed with an error code. We should abort the
+ // complete chain.
+ resetCommandClass(code);
+ }
+ } else {
+ if (m_cmdData) {
+ if (m_cmdData->isProcessing()) {
+ m_cmdData->autoDestruct(code);
+ return;
+ } else {
+ if (!m_cmdData->isClean())
+ m_cmdData->cleanup();
+
+ delete m_cmdData;
+ m_cmdData = 0;
+ }
+ }
+
+ if (code == Failed)
+ emitError(OperationFailed);
+
+ // Reset current command and emit a ready event
+ if (getCurrentCommand() != Commands::CmdConnectRetry) {
+ setCurrentCommand(Commands::CmdNone);
+ emitEvent(Event::EventReady);
+ emitEvent(Event::EventState, i18n("Idle."));
+ }
+
+ setErrorReporting(true);
+ m_shouldAbort = false;
+ }
+}
+
+void Socket::nextCommand()
+{
+ if (m_commandChain.count() > 0) {
+ Commands::Base *current = m_commandChain.current();
+
+ current->setProcessing(true);
+ current->process();
+ current->setProcessing(false);
+
+ if (current->isDestructable())
+ resetCommandClass(current->resetCode());
+ } else if (m_cmdData) {
+ m_cmdData->setProcessing(true);
+ m_cmdData->process();
+ m_cmdData->setProcessing(false);
+
+ if (m_cmdData->isDestructable())
+ resetCommandClass(m_cmdData->resetCode());
+ }
+}
+
+void Socket::nextCommandAsync()
+{
+ m_thread->m_commandQueue.append(Commands::CmdNext);
+}
+
+void Socket::wakeup(WakeupEvent *event)
+{
+ if (m_commandChain.count() > 0) {
+ Commands::Base *current = m_commandChain.current();
+
+ if (current->isProcessing()) {
+ qDebug("WARNING: Attempted to wakeup a processing socket!");
+ return;
+ }
+
+ current->setProcessing(true);
+ current->wakeup(event);
+ current->setProcessing(false);
+
+ if (current->isDestructable())
+ resetCommandClass(current->resetCode());
+ } else if (m_cmdData) {
+ if (m_cmdData->isProcessing()) {
+ qDebug("WARNING: Attempted to wakeup a processing socket!");
+ return;
+ }
+
+ m_cmdData->setProcessing(true);
+ m_cmdData->wakeup(event);
+ m_cmdData->setProcessing(false);
+
+ if (m_cmdData->isDestructable())
+ resetCommandClass(m_cmdData->resetCode());
+ }
+}
+
+filesize_t Socket::getTransferSpeed()
+{
+ time_t timeDelta = time(0) - m_speedLastTime;
+
+ if (timeDelta == 0)
+ return 0;
+
+ if (m_speedLastBytes > m_transferBytes)
+ m_speedLastBytes = 0;
+
+ filesize_t speed = (m_transferBytes - m_speedLastBytes)/(time(0) - m_speedLastTime);
+
+ m_speedLastBytes = m_transferBytes;
+ m_speedLastTime = time(0);
+
+ return speed;
+}
+
+void Socket::protoAbort()
+{
+ m_shouldAbort = true;
+
+ if (m_connectionRetry && !m_cmdData)
+ m_connectionRetry->abortRetry();
+}
+
+// *******************************************************************************************
+// ******************************************* STAT ******************************************
+// *******************************************************************************************
+
+class FtpCommandStat : public Commands::Base {
+public:
+ enum State {
+ None,
+ WaitList
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandStat, Socket, CmdNone)
+
+ KURL path;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ // Issue a list of the parent directory
+ currentState = WaitList;
+ socket()->setErrorReporting(false);
+ socket()->protoList(path.directory());
+ break;
+ }
+ case WaitList: {
+ // Now just extract what we need
+ QValueList<DirectoryEntry> list = socket()->getLastDirectoryListing().list();
+ QValueList<DirectoryEntry>::iterator listEnd = list.end();
+ for (QValueList<DirectoryEntry>::iterator i = list.begin(); i != listEnd; i++) {
+ if ((*i).filename() == path.fileName()) {
+ socket()->m_lastStatResponse = *i;
+ socket()->resetCommandClass();
+ return;
+ }
+ }
+
+ // We found no such file
+ socket()->m_lastStatResponse = DirectoryEntry();
+ socket()->resetCommandClass();
+ break;
+ }
+ }
+ }
+};
+
+void Socket::protoStat(const KURL &path)
+{
+ // Lookup the cache first and don't even try to list if cached
+ DirectoryListing cached = Cache::self()->findCached(this, path.directory());
+ if (cached.isValid()) {
+ QValueList<DirectoryEntry> list = cached.list();
+ QValueList<DirectoryEntry>::iterator listEnd = list.end();
+ for (QValueList<DirectoryEntry>::iterator i = list.begin(); i != listEnd; i++) {
+ if ((*i).filename() == path.fileName()) {
+ m_lastStatResponse = *i;
+ nextCommandAsync();
+ return;
+ }
+ }
+
+ // Cached is valid but file can't be found
+ m_lastStatResponse = DirectoryEntry();
+ nextCommandAsync();
+ return;
+ }
+
+ // Not cached, let's do a real listing
+ FtpCommandStat *stat = new FtpCommandStat(this);
+ stat->path = path;
+ addToCommandChain(stat);
+ nextCommand();
+}
+
+// *******************************************************************************************
+// ****************************************** SCAN *******************************************
+// *******************************************************************************************
+
+class FtpCommandScan : public Commands::Base {
+public:
+ enum State {
+ None,
+ SentList,
+ ProcessList,
+ ScannedDir
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandScan, Socket, CmdNone)
+
+ QValueList<DirectoryEntry> currentList;
+ QValueList<DirectoryEntry>::const_iterator currentEntry;
+
+ QString currentDirectory;
+ DirectoryTree *currentTree;
+
+ void cleanup()
+ {
+ // We didn't emit the tree, so we should free it
+ if (!socket()->isChained())
+ delete currentTree;
+ }
+
+ void process()
+ {
+ // NOTE: The missing breaks are mising for a purpuse! Do not dare to add them ;)
+ switch (currentState) {
+ case None: {
+ // We would like to disable error reporting
+ socket()->setErrorReporting(false);
+
+ // Issue a directory listing on the given URL
+ currentState = SentList;
+ socket()->protoList(currentDirectory);
+ break;
+ }
+ case SentList: {
+ currentList = socket()->getLastDirectoryListing().list();
+ qHeapSort(currentList);
+
+ currentEntry = currentList.begin();
+ currentState = ProcessList;
+
+ // Empty listing, we are done
+ if (currentEntry == currentList.end()) {
+ if (socket()->isChained()) {
+ socket()->resetCommandClass();
+ } else {
+ // We are the toplevel scan command
+ markClean();
+
+ socket()->emitEvent(Event::EventScanComplete, currentTree);
+ socket()->emitEvent(Event::EventMessage, i18n("Scan complete."));
+ socket()->resetCommandClass();
+ }
+
+ return;
+ }
+ }
+ case ProcessList: {
+ if ((*currentEntry).isDirectory()) {
+ // A directory entry
+ DirectoryTree *tree = currentTree->addDirectory(*currentEntry);
+ currentState = ScannedDir;
+
+ FtpCommandScan *scan = new FtpCommandScan(socket());
+ scan->currentDirectory = currentDirectory + "/" + (*currentEntry).filename();
+ scan->currentTree = tree;
+ socket()->addToCommandChain(scan);
+ socket()->nextCommandAsync();
+ return;
+ } else {
+ // A file entry
+ currentTree->addFile(*currentEntry);
+ }
+ }
+ case ScannedDir: {
+ currentState = ProcessList;
+
+ if (++currentEntry == currentList.end()) {
+ // We are done
+ if (socket()->isChained()) {
+ socket()->resetCommandClass();
+ } else {
+ // We are the toplevel scan command
+ markClean();
+
+ socket()->emitEvent(Event::EventScanComplete, currentTree);
+ socket()->emitEvent(Event::EventMessage, i18n("Scan complete."));
+ socket()->resetCommandClass();
+ }
+ } else {
+ socket()->nextCommandAsync();
+ }
+ break;
+ }
+ }
+ }
+};
+
+void Socket::protoScan(const KURL &path)
+{
+ emitEvent(Event::EventMessage, i18n("Starting recursive directory scan..."));
+
+ // We have to create a new command class manually, since we need to set the
+ // currentTree parameter
+ FtpCommandScan *scan = new FtpCommandScan(this);
+ scan->currentDirectory = path.path();
+ scan->currentTree = new DirectoryTree(DirectoryEntry());
+ m_cmdData = scan;
+ m_cmdData->process();
+}
+
+// *******************************************************************************************
+// ***************************************** DELETE ******************************************
+// *******************************************************************************************
+
+class FtpCommandDelete : public Commands::Base {
+public:
+ enum State {
+ None,
+ VerifyDir,
+ SimpleRemove,
+ SentList,
+ ProcessList,
+ DeletedDir,
+ DeletedFile
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandDelete, Socket, CmdDelete)
+
+ QValueList<DirectoryEntry> currentList;
+ QValueList<DirectoryEntry>::const_iterator currentEntry;
+
+ KURL destinationPath;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ // We have to determine if the destination is a file or a directory
+ // TODO use cached information
+ if (socket()->isChained()) {
+ // We know that it is a directory
+ currentState = SentList;
+ socket()->protoList(destinationPath);
+ } else {
+ currentState = VerifyDir;
+ socket()->protoStat(destinationPath);
+ }
+ break;
+ }
+ case VerifyDir: {
+ DirectoryEntry entry = socket()->getStatResponse();
+
+ if (entry.filename().isEmpty()) {
+ // The file doesn't exist, abort
+ socket()->resetCommandClass(Failed);
+ } else {
+ if (entry.isDirectory()) {
+ // It is a directory, remove recursively
+ currentState = SentList;
+ socket()->protoList(destinationPath);
+ } else {
+ // A single file, a simple remove
+ currentState = SimpleRemove;
+ socket()->setConfig("params.remove.directory", 0);
+ socket()->protoRemove(destinationPath);
+ }
+ }
+ break;
+ }
+ case SimpleRemove: {
+ if (!socket()->isChained())
+ socket()->emitEvent(Event::EventReloadNeeded);
+ socket()->resetCommandClass();
+ break;
+ }
+ case SentList: {
+ currentList = socket()->getLastDirectoryListing().list();
+ currentEntry = currentList.begin();
+ currentState = ProcessList;
+
+ // Empty listing, we are done
+ if (currentEntry == currentList.end()) {
+ if (socket()->isChained())
+ socket()->resetCommandClass();
+ else {
+ // We are the top level command class, remove the destination dir
+ currentState = SimpleRemove;
+ socket()->setConfig("params.remove.directory", 1);
+ socket()->protoRemove(destinationPath);
+ }
+
+ return;
+ }
+ }
+ case ProcessList: {
+ KURL childPath = destinationPath;
+ childPath.addPath((*currentEntry).filename());
+
+ if ((*currentEntry).isDirectory()) {
+ // A directory, chain another delete command
+ currentState = DeletedDir;
+
+ // Chain manually, since we need to set some parameters
+ FtpCommandDelete *del = new FtpCommandDelete(socket());
+ del->destinationPath = childPath;
+ socket()->addToCommandChain(del);
+ socket()->nextCommand();
+ } else {
+ // A file entry - remove
+ currentState = DeletedFile;
+ socket()->setConfig("params.remove.directory", 0);
+ socket()->protoRemove(childPath);
+ }
+ break;
+ }
+ case DeletedDir: {
+ // We have to remove the empty directory
+ KURL childPath = destinationPath;
+ childPath.addPath((*currentEntry).filename());
+
+ currentState = DeletedFile;
+ socket()->setConfig("params.remove.directory", 1);
+ socket()->protoRemove(childPath);
+ break;
+ }
+ case DeletedFile: {
+ currentState = ProcessList;
+
+ if (++currentEntry == currentList.end()) {
+ if (socket()->isChained())
+ socket()->resetCommandClass();
+ else {
+ // We are the top level command class, remove the destination dir
+ currentState = SimpleRemove;
+ socket()->setConfig("params.remove.directory", 1);
+ socket()->protoRemove(destinationPath);
+ }
+ } else
+ socket()->nextCommand();
+ break;
+ }
+ }
+ }
+};
+
+void Socket::protoDelete(const KURL &path)
+{
+ // We have to create a new command class manually to set some parameter
+ FtpCommandDelete *del = new FtpCommandDelete(this);
+ del->destinationPath = path;
+ m_cmdData = del;
+ m_cmdData->process();
+}
+
+// *******************************************************************************************
+// ***************************************** CHMOD *******************************************
+// *******************************************************************************************
+
+class FtpCommandRecursiveChmod : public Commands::Base {
+public:
+ enum State {
+ None,
+ VerifyDir,
+ SimpleChmod,
+ SentList,
+ ProcessList,
+ ChmodedDir,
+ ChmodedFile
+ };
+
+ ENGINE_STANDARD_COMMAND_CONSTRUCTOR(FtpCommandRecursiveChmod, Socket, CmdChmod)
+
+ QValueList<DirectoryEntry> currentList;
+ QValueList<DirectoryEntry>::const_iterator currentEntry;
+
+ KURL destinationPath;
+ int mode;
+
+ void process()
+ {
+ switch (currentState) {
+ case None: {
+ // We have to determine if the destination is a file or a directory
+ if (socket()->isChained()) {
+ // We know that it is a directory
+ currentState = SentList;
+ socket()->protoList(destinationPath);
+ } else {
+ currentState = VerifyDir;
+ socket()->protoStat(destinationPath);
+ }
+ break;
+ }
+ case VerifyDir: {
+ DirectoryEntry entry = socket()->getStatResponse();
+
+ if (entry.filename().isEmpty()) {
+ // The file doesn't exist, abort
+ socket()->resetCommandClass(Failed);
+ } else {
+ if (entry.isDirectory()) {
+ // It is a directory, chmod recursively
+ currentState = SentList;
+ socket()->protoList(destinationPath);
+ } else {
+ // A single file, a simple chmod
+ currentState = SimpleChmod;
+ socket()->protoChmodSingle(destinationPath, mode);
+ }
+ }
+ break;
+ }
+ case SimpleChmod: {
+ socket()->resetCommandClass();
+ break;
+ }
+ case SentList: {
+ currentList = socket()->getLastDirectoryListing().list();
+ currentEntry = currentList.begin();
+ currentState = ProcessList;
+
+ // Empty listing, we are done
+ if (currentEntry == currentList.end()) {
+ if (socket()->isChained())
+ socket()->resetCommandClass();
+ else {
+ // We are the top level command class, chmod the destination dir
+ currentState = SimpleChmod;
+ socket()->protoChmodSingle(destinationPath, mode);
+ }
+
+ return;
+ }
+ }
+ case ProcessList: {
+ KURL childPath = destinationPath;
+ childPath.addPath((*currentEntry).filename());
+
+ if ((*currentEntry).isDirectory()) {
+ // A directory, chain another recursive chmod command
+ currentState = ChmodedDir;
+
+ // Chain manually, since we need to set some parameters
+ FtpCommandRecursiveChmod *cm = new FtpCommandRecursiveChmod(socket());
+ cm->destinationPath = childPath;
+ cm->mode = mode;
+ socket()->addToCommandChain(cm);
+ socket()->nextCommand();
+ } else {
+ // A file entry - remove
+ currentState = ChmodedFile;
+ socket()->protoChmodSingle(childPath, mode);
+ }
+ break;
+ }
+ case ChmodedDir: {
+ // We have to chmod the directory
+ KURL childPath = destinationPath;
+ childPath.addPath((*currentEntry).filename());
+
+ currentState = ChmodedFile;
+ socket()->protoChmodSingle(childPath, mode);
+ break;
+ }
+ case ChmodedFile: {
+ currentState = ProcessList;
+
+ if (++currentEntry == currentList.end()) {
+ if (socket()->isChained())
+ socket()->resetCommandClass();
+ else {
+ // We are the top level command class, chmod the destination dir
+ currentState = SimpleChmod;
+ socket()->protoChmodSingle(destinationPath, mode);
+ }
+ } else
+ socket()->nextCommand();
+ break;
+ }
+ }
+ }
+};
+
+void Socket::protoChmod(const KURL &path, int mode, bool recursive)
+{
+ if (recursive) {
+ // We have to create a new command class manually to set some parameters
+ FtpCommandRecursiveChmod *cm = new FtpCommandRecursiveChmod(this);
+ cm->destinationPath = path;
+ cm->mode = mode;
+ m_cmdData = cm;
+ m_cmdData->process();
+ } else {
+ // No recursive, just chmod a single file
+ protoChmodSingle(path, mode);
+ }
+}
+
+}
diff --git a/kftpgrabber/src/engine/socket.h b/kftpgrabber/src/engine/socket.h
new file mode 100644
index 0000000..3c2296a
--- /dev/null
+++ b/kftpgrabber/src/engine/socket.h
@@ -0,0 +1,605 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPENGINESOCKET_H
+#define KFTPENGINESOCKET_H
+
+#include <kurl.h>
+#include <kremoteencoding.h>
+
+#include <qptrlist.h>
+#include <qguardedptr.h>
+#include <qdatetime.h>
+
+#include "commands.h"
+
+namespace KFTPEngine {
+
+class ConnectionRetry;
+
+enum SocketFeatures {
+ SF_FXP_TRANSFER = 1,
+ SF_RAW_COMMAND = 2
+};
+
+/**
+ * The socket class provides an abstract class for all implemented protocols. It
+ * provides basic methods and also some remote operations (recursive scan,
+ * recursive removal).
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class Socket
+{
+friend class Thread;
+friend class FtpCommandStat;
+public:
+ /**
+ * Constructs a new socket.
+ *
+ * @param thread The thread that created this socket
+ * @param protocol The protocol name
+ */
+ Socket(Thread *thread, const QString &protocol);
+ ~Socket();
+
+ /**
+ * Set an internal config value.
+ *
+ * @param key Key
+ * @param value Value
+ */
+ void setConfig(const QString &key, const QString &value) { m_config[key] = value; }
+
+ /**
+ * Set an internal config value.
+ *
+ * @param key Key
+ * @param value Value
+ */
+ void setConfig(const QString &key, int value) { m_config[key] = QString::number(value); }
+
+ /**
+ * Set an internal config value.
+ *
+ * @param key Key
+ * @param value Value
+ */
+ void setConfig(const QString &key, filesize_t value) { m_config[key] = QString::number(value); }
+
+ /**
+ * Get an internal config value as string.
+ *
+ * @param key Key
+ * @return The key's value or an empty string if the key doesn't exist
+ */
+ QString getConfig(const QString &key) { return m_config[key]; }
+
+ /**
+ * Get an internal config value as an integer.
+ *
+ * @param key Key
+ * @return The key's value or 0 if the key doesn't exist
+ */
+ int getConfigInt(const QString &key) { return m_config[key].toInt(); }
+
+ /**
+ * Get an internal config value as filesize.
+ *
+ * @param key Key
+ * @return The key's value or 0 if the key doesn't exist
+ */
+ filesize_t getConfigFs(const QString &key) { return m_config[key].toULongLong(); }
+
+ /**
+ * This method should initialize the configuration map.
+ */
+ virtual void initConfig();
+
+ /**
+ * This method should trigger the connection process.
+ *
+ * @param url Remote url to connect to
+ */
+ virtual void protoConnect(const KURL &url) = 0;
+
+ /**
+ * This method should disconnect from the remote host.
+ */
+ virtual void protoDisconnect();
+
+ /**
+ * This method should abort any ongoing action.
+ */
+ virtual void protoAbort();
+
+ /**
+ * This method should download a remote file and save it localy.
+ *
+ * @param source The source url
+ * @param destination The destination url
+ */
+ virtual void protoGet(const KURL &source, const KURL &destination) = 0;
+
+ /**
+ * This method should upload a local file and save it remotely.
+ *
+ * @param source The source url
+ * @param destination The destination url
+ */
+ virtual void protoPut(const KURL &source, const KURL &destination) = 0;
+
+ /**
+ * Each protocol should implement this method. It should remove just one
+ * single entry. A config variable "params.remove.directory" will be set
+ * to 1 if the entry to remove is a directory and to 0 if it should expect
+ * a file.
+ *
+ * @warning You should NOT use this method directly! Use @ref protoDelete
+ * instead!
+ * @param path The path to the entry to remove
+ */
+ virtual void protoRemove(const KURL &path) = 0;
+
+ /**
+ * This method should rename/move a remote file.
+ *
+ * @param source The source file path
+ * @param destination The destination file path
+ */
+ virtual void protoRename(const KURL &source, const KURL &destination) = 0;
+
+ /**
+ * This method should change file's mode.
+ *
+ * * @warning You should NOT use this method directly! Use @ref protoChmod
+ * instead!
+ * @param path The file's path
+ * @param mode The new file mode
+ */
+ virtual void protoChmodSingle(const KURL &path, int mode) = 0;
+
+ /**
+ * This method should create a new remote directory.
+ *
+ * @param path Path of the newly created remote directory
+ */
+ virtual void protoMkdir(const KURL &path) = 0;
+
+ /**
+ * This method should fetch the remote directory listing for a specified
+ * directory. Note that this method could be called as a chained command,
+ * so it MUST NOT emit an EventDirectoryListing event if isChained returns
+ * true! In this case it should save the directory listing to the
+ * m_lastDirectoryListing member variable.
+ *
+ * @param path The path to list
+ */
+ virtual void protoList(const KURL &path) = 0;
+
+ /**
+ * This method should fetch the information about the given path. It is
+ * usualy called as a chained command.
+ *
+ * @param path The path to stat
+ */
+ virtual void protoStat(const KURL &path);
+
+ /**
+ * This method should send a raw command in case the protocol supports it
+ * (the SF_RAW_COMMAND is among features).
+ *
+ * @param command The command to send
+ */
+ virtual void protoRaw(const QString&) {}
+
+ /**
+ * This method should initiate a site to site transfer in case the protocol
+ * supports it (the SF_FXP_TRANSFER is among features).
+ *
+ * @param socket The destination socket
+ * @param source The source url
+ * @param destination The destination url
+ */
+ virtual void protoSiteToSite(Socket*, const KURL&, const KURL&) {}
+
+ /**
+ * Send a packet to keep the connection alive.
+ */
+ virtual void protoKeepAlive() {}
+
+ /**
+ * Recursively scan a directory and emit a DirectoryTree that can be used to
+ * create new transfers for addition to the queue.
+ *
+ * @param path The path to recursively scan
+ */
+ void protoScan(const KURL &path);
+
+ /**
+ * Identify if the remote path is a file or a directory and recursively remove
+ * it if so. The difference between this command and @ref protoRemove is, that
+ * protoRemove removes just one entry, and doesn't identify file type.
+ *
+ * @param path The path to remove
+ */
+ void protoDelete(const KURL &path);
+
+ /**
+ * Change file or directory mode. Also supports recursive mode changes.
+ *
+ * @param path The file's path
+ * @param mode The new file mode
+ * @param recursive Should the mode be recursively changed
+ */
+ void protoChmod(const KURL &path, int mode, bool recursive);
+
+ /**
+ * Returns this socket's parent thread.
+ *
+ * @return Socket's parent thread
+ */
+ Thread *thread() { return m_thread; }
+
+ /**
+ * Returns the protocol name of this socket.
+ *
+ * @return This socket's protocol name
+ */
+ QString protocolName() { return m_protocol; }
+
+ /**
+ * This method should return the socket's features by or-ing the values in
+ * SocketFeatures enum.
+ *
+ * @return Socket's features
+ */
+ virtual int features() = 0;
+
+ /**
+ * This method should return true if this socket is connected.
+ *
+ * @return True if the socket has successfully connected
+ */
+ virtual bool isConnected() = 0;
+
+ /**
+ * This method should return true if the connection is encrypted by some method.
+ *
+ * @return True if the connection is encrypted
+ */
+ virtual bool isEncrypted() = 0;
+
+ /**
+ * Returns true if the socket is currently busy performing an action.
+ *
+ * @return True if the socket is busy
+ */
+ virtual bool isBusy() { return m_currentCommand != Commands::CmdNone; }
+
+ /**
+ * Emit an engine error code.
+ *
+ * @param code The error code
+ * @param param1 Optional string parameter
+ */
+ void emitError(ErrorCode code, const QString &param1 = 0);
+
+ /**
+ * Emit an engine event.
+ *
+ * @param type Event type
+ * @param param1 Optional string parameter
+ * @param param2 Optional string parameter
+ */
+ void emitEvent(Event::Type type, const QString &param1 = 0, const QString &param2 = 0);
+
+ /**
+ * Emit an engine event containing a directory listing.
+ *
+ * @param type Event type
+ * @param param1 The DirectoryListing parameter
+ */
+ void emitEvent(Event::Type type, DirectoryListing param1);
+
+ /**
+ * Emit an engine event containing a filesize.
+ *
+ * @param type Event type
+ * @param param1 The filesize parameter
+ */
+ void emitEvent(Event::Type type, filesize_t param1);
+
+ /**
+ * Emit an engine event containing a custom pointer.
+ *
+ * @param type Event type
+ * @param param1 The custom pointer parameter
+ */
+ void emitEvent(Event::Type type, void *param1);
+
+ /**
+ * This method will set the socket's remote encoding which will be used when
+ * converting filenames into UTF-8 and back.
+ *
+ * @param encoding A valid encoding name
+ */
+ virtual void changeEncoding(const QString &encoding);
+
+ /**
+ * Retrieve the KRemoteEncoding object for this socket set to the appropriate
+ * encoding.
+ *
+ * @return The KRemoteEncoding object
+ */
+ KRemoteEncoding *remoteEncoding() { return m_remoteEncoding; }
+
+ /**
+ * Sets the current directory path.
+ *
+ * @param path The current directory path
+ */
+ void setCurrentDirectory(const QString &path) { m_currentDirectory = path; }
+
+ /**
+ * Get the current directory path.
+ *
+ * @return The current directory path.
+ */
+ virtual QString getCurrentDirectory() { return m_currentDirectory; }
+
+ /**
+ * Sets the default directory path (like a remote home directory).
+ *
+ * @param path The default directory path
+ */
+ void setDefaultDirectory(const QString &path) { m_defaultDirectory = path; }
+
+ /**
+ * Get the default directory path.
+ *
+ * @return The default directory path
+ */
+ virtual QString getDefaultDirectory() { return m_defaultDirectory; }
+
+ /**
+ * Sets the url this socket is connected to.
+ *
+ * @param url The url this socket is connected to
+ */
+ void setCurrentUrl(const KURL &url) { m_currentUrl = url; }
+
+ /**
+ * Get the url this socket is connected to.
+ *
+ * @return The url this socket is currently connected to
+ */
+ KURL getCurrentUrl() { return m_currentUrl; }
+
+ /**
+ * Sets the command the socket is currently executing.
+ *
+ * @param type Command type
+ */
+ void setCurrentCommand(Commands::Type type) { m_currentCommand = type; }
+
+ /**
+ * Get the current socket command.
+ *
+ * @return The current socket command
+ */
+ Commands::Type getCurrentCommand();
+
+ /**
+ * Get the toplevel socket command in the command chain.
+ *
+ * @return The toplevel socket command
+ */
+ Commands::Type getToplevelCommand();
+
+ /**
+ * Get the command that executed the current command. Note that this
+ * is valid only if the current command is chained. Otherwise this
+ * method returns Commands::CmdNone.
+ *
+ * @return The previous command
+ */
+ Commands::Type getPreviousCommand();
+
+ /**
+ * Get the last directory listing made by protoList.
+ *
+ * @return The last directory listing
+ */
+ DirectoryListing getLastDirectoryListing() { return m_lastDirectoryListing; }
+
+ /**
+ * Get the last stat response made by protoStat.
+ *
+ * @return The last stat response
+ */
+ DirectoryEntry getStatResponse() { return m_lastStatResponse; }
+
+ /**
+ * Get the number of bytes transfered from the beginning of the transfer.
+ *
+ * @return The number of bytes transfered
+ */
+ filesize_t getTransferBytes() { return m_transferBytes; }
+
+ /**
+ * Get the current transfer speed.
+ *
+ * @return The current transfer speed.
+ */
+ filesize_t getTransferSpeed();
+
+ /**
+ * This method will be called every cycle. It should be usually used to
+ * poll the data transfer socket.
+ */
+ virtual void poll() = 0;
+
+ /**
+ * Wakeup the last command processor with a specific wakeup event. This
+ * is used for async two-way communication between the engine and the
+ * GUI (wakeup event is a reply from the GUI).
+ *
+ * By default this method just passes the event to the currently active
+ * command processor.
+ *
+ * @param event The wakeup event that should be passed to the command class
+ */
+ virtual void wakeup(WakeupEvent *event);
+
+ /**
+ * Reset the current command class, possibly invoking the calling chained
+ * command class or completing the operation.
+ *
+ * @param code The result code
+ */
+ virtual void resetCommandClass(ResetCode code = Ok);
+
+ /**
+ * Add a command class to the command chain so that it will be executed next.
+ *
+ * @param cmd The command class to add
+ */
+ void addToCommandChain(Commands::Base *cmd) { m_commandChain.append(cmd); }
+
+ /**
+ * Execute the next command.
+ */
+ void nextCommand();
+
+ /**
+ * Schedule the execution of the next command in the next thread loop.
+ */
+ void nextCommandAsync();
+
+ /**
+ * Returns true if the current command has been chained from another command class.
+ *
+ * @return True if the current command has been chained
+ */
+ bool isChained() { return m_commandChain.count() > 0; }
+
+ /**
+ * Set the error reporting on or off. This variable is then used by some
+ * command classes do determine if they should emit errors and reset with
+ * failure or if they should just silently ignore the error and reset
+ * the command class with an Ok code.
+ *
+ * @param value Error reporting value
+ */
+ void setErrorReporting(bool value) { m_errorReporting = value; }
+
+ /**
+ * Get the current error reporting setting. This only makes sense if the
+ * class is chained - otherwise this allways returns true.
+ *
+ * @return The current error reporting setting
+ */
+ bool errorReporting() { return m_errorReporting || !isChained(); }
+
+ /**
+ * Returns true if the current operation should abort. This method should be
+ * used when the underlying socket implementation is doing blocking operations.
+ *
+ * @return True if the operation should be aborted
+ */
+ bool shouldAbort() { return m_shouldAbort; }
+protected:
+ /**
+ * Call this method when a long wait period has started or ended. If the wait
+ * isn't nulled before the timeout is reached the current action will be aborted
+ * and the socket will be disconnected.
+ *
+ * @param start True if the wait period should start, false if it should end
+ */
+ void timeoutWait(bool start);
+
+ /**
+ * Reset the timeout counter. Call this once in a while during long wait periods
+ * to notify the engine that the socket is still responsive.
+ */
+ void timeoutPing();
+
+ /**
+ * Check if we should timeout. This method might cause a disconnect if the timeout
+ * value is reached.
+ */
+ void timeoutCheck();
+
+ /**
+ * Enable the issue of keepalive packets.
+ */
+ void keepaliveStart();
+
+ /**
+ * Check if we should transmit a new keepalive packet.
+ */
+ void keepaliveCheck();
+protected:
+ KRemoteEncoding *m_remoteEncoding;
+
+ Commands::Base *m_cmdData;
+ QPtrList<Commands::Base> m_commandChain;
+
+ Thread *m_thread;
+ DirectoryListing m_lastDirectoryListing;
+ DirectoryEntry m_lastStatResponse;
+
+ filesize_t m_transferBytes;
+ time_t m_speedLastTime;
+ filesize_t m_speedLastBytes;
+
+ QTime m_timeoutCounter;
+ QTime m_keepaliveCounter;
+private:
+ QMap<QString, QString> m_config;
+ QString m_currentDirectory;
+ QString m_defaultDirectory;
+ KURL m_currentUrl;
+ QString m_protocol;
+ Commands::Type m_currentCommand;
+ bool m_errorReporting;
+ bool m_shouldAbort;
+ QGuardedPtr<ConnectionRetry> m_connectionRetry;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/speedlimiter.cpp b/kftpgrabber/src/engine/speedlimiter.cpp
new file mode 100644
index 0000000..85f2b72
--- /dev/null
+++ b/kftpgrabber/src/engine/speedlimiter.cpp
@@ -0,0 +1,240 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2007 by the KFTPGrabber developers
+ * Copyright (C) 2003-2007 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "speedlimiter.h"
+#include "misc/config.h"
+
+#include <kstaticdeleter.h>
+
+using namespace KFTPCore;
+
+namespace KFTPEngine {
+
+static const int tickDelay = 250;
+static int bucketSize = 1000 / tickDelay;
+
+SpeedLimiter *SpeedLimiter::m_self = 0;
+static KStaticDeleter<SpeedLimiter> staticSpeedLimiterDeleter;
+
+SpeedLimiter *SpeedLimiter::self()
+{
+ if (!m_self) {
+ staticSpeedLimiterDeleter.setObject(m_self, new SpeedLimiter());
+ }
+
+ return m_self;
+}
+
+SpeedLimiter::SpeedLimiter()
+ : m_timer(false)
+{
+ // Reset limits and token debts
+ m_limits[0] = 0;
+ m_limits[1] = 0;
+
+ m_tokenDebt[0] = 0;
+ m_tokenDebt[1] = 0;
+
+ // Subscribe to config updates and update the limits
+ connect(Config::self(), SIGNAL(configChanged()), this, SLOT(updateLimits()));
+ updateLimits();
+}
+
+SpeedLimiter::~SpeedLimiter()
+{
+ if (m_self == this)
+ staticSpeedLimiterDeleter.setObject(m_self, 0, false);
+}
+
+void SpeedLimiter::updateLimits()
+{
+ setLimit(SpeedLimiter::Download, Config::downloadSpeedLimit() * 1024);
+ setLimit(SpeedLimiter::Upload, Config::uploadSpeedLimit() * 1024);
+}
+
+void SpeedLimiter::setLimit(Type type, int limit)
+{
+ m_limits[type] = limit;
+}
+
+void SpeedLimiter::append(SpeedLimiterItem *item, Type type)
+{
+ m_objects[type].append(item);
+
+ int limit = m_limits[type];
+ if (limit > 0) {
+ int tokens = limit * tickDelay / 1000;
+ tokens /= m_objects[type].count();
+
+ if (m_tokenDebt[type] > 0) {
+ if (tokens >= m_tokenDebt[type]) {
+ tokens -= m_tokenDebt[type];
+ m_tokenDebt[type] = 0;
+ } else {
+ tokens = 0;
+ }
+ }
+
+ item->m_availableBytes = tokens;
+ } else {
+ item->m_availableBytes = -1;
+ }
+
+ // Fire the timer if not running
+ if (!m_timer) {
+ startTimer(tickDelay);
+ m_timer = true;
+ }
+}
+
+void SpeedLimiter::remove(SpeedLimiterItem *item)
+{
+ remove(item, Download);
+ remove(item, Upload);
+}
+
+void SpeedLimiter::remove(SpeedLimiterItem *item, Type type)
+{
+ if (m_objects[type].containsRef(item)) {
+ int tokens = m_limits[type] * tickDelay / 1000;
+ tokens /= m_objects[type].count();
+
+ if (item->m_availableBytes < tokens)
+ m_tokenDebt[type] += tokens - item->m_availableBytes;
+
+ m_objects[type].removeRef(item);
+ }
+
+ item->m_availableBytes = -1;
+}
+
+void SpeedLimiter::timerEvent(QTimerEvent*)
+{
+ QPtrList<SpeedLimiterItem> pendingWakeup;
+
+ for (int i = 0; i < 2; i++) {
+ m_tokenDebt[i] = 0;
+
+ int limit = m_limits[i];
+ if (!limit) {
+ // There is no limit, reset all items
+ for (SpeedLimiterItem *item = m_objects[i].first(); item; item = m_objects[i].next()) {
+ item->m_availableBytes = -1;
+ }
+
+ continue;
+ }
+
+ // If there are no objects, just skip it
+ if (m_objects[i].isEmpty())
+ continue;
+
+ int tokens = limit * tickDelay / 1000;
+ if (!tokens)
+ tokens = 1;
+
+ int maxTokens = tokens * bucketSize;
+
+ // Get amount of tokens for each object
+ int tokensPerObject = tokens / m_objects[i].count();
+ if (!tokensPerObject)
+ tokensPerObject = 1;
+
+ tokens = 0;
+
+ QPtrList<SpeedLimiterItem> unsaturatedObjects;
+
+ for (SpeedLimiterItem *item = m_objects[i].first(); item; item = m_objects[i].next()) {
+ if (item->m_availableBytes == -1) {
+ item->m_availableBytes = tokensPerObject;
+ unsaturatedObjects.append(item);
+ } else {
+ item->m_availableBytes += tokensPerObject;
+
+ if (item->m_availableBytes > maxTokens) {
+ tokens += item->m_availableBytes - maxTokens;
+ item->m_availableBytes = maxTokens;
+ } else {
+ unsaturatedObjects.append(item);
+ }
+ }
+ }
+
+ // Assign any left-overs to unsaturated sources
+ while (tokens && !unsaturatedObjects.isEmpty()) {
+ tokensPerObject = tokens / unsaturatedObjects.count();
+ if (!tokensPerObject)
+ break;
+
+ tokens = 0;
+
+ for (SpeedLimiterItem *item = unsaturatedObjects.first(); item; item = unsaturatedObjects.next()) {
+ item->m_availableBytes += tokensPerObject;
+
+ if (item->m_availableBytes > maxTokens) {
+ tokens += item->m_availableBytes - maxTokens;
+ item->m_availableBytes = maxTokens;
+ unsaturatedObjects.removeRef(item);
+ }
+ }
+ }
+ }
+
+ if (m_objects[0].isEmpty() && m_objects[1].isEmpty()) {
+ killTimers();
+ m_timer = false;
+ }
+}
+
+SpeedLimiterItem::SpeedLimiterItem()
+ : m_availableBytes(-1)
+{
+}
+
+void SpeedLimiterItem::updateUsage(int bytes)
+{
+ // Ignore if there are no limits
+ if (m_availableBytes == -1)
+ return;
+
+ if (bytes > m_availableBytes)
+ m_availableBytes = 0;
+ else
+ m_availableBytes -= bytes;
+}
+
+}
+
+#include "speedlimiter.moc"
diff --git a/kftpgrabber/src/engine/speedlimiter.h b/kftpgrabber/src/engine/speedlimiter.h
new file mode 100644
index 0000000..789cb19
--- /dev/null
+++ b/kftpgrabber/src/engine/speedlimiter.h
@@ -0,0 +1,158 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2007 by the KFTPGrabber developers
+ * Copyright (C) 2003-2007 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPENGINESPEEDLIMITER_H
+#define KFTPENGINESPEEDLIMITER_H
+
+#include <qobject.h>
+#include <qptrlist.h>
+
+namespace KFTPEngine {
+
+class SpeedLimiterItem;
+
+/**
+ * This class is used by Socket implementations to enforce speed limits for
+ * uploads or downloads. It implements a variant of Token Bucket algorithm.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class SpeedLimiter : public QObject {
+Q_OBJECT
+public:
+ /**
+ * Possible limit types.
+ */
+ enum Type {
+ Download = 0,
+ Upload = 1
+ };
+
+ /**
+ * Returns the global speed limiter instance.
+ */
+ static SpeedLimiter *self();
+
+ /**
+ * Class destructor.
+ */
+ ~SpeedLimiter();
+
+ /**
+ * Set a limit rate.
+ *
+ * @param type Limit type
+ * @param limit Rate
+ */
+ void setLimit(Type type, int limit);
+
+ /**
+ * Appends an item to be managed by the speed limiter.
+ *
+ * @param item Item instance
+ * @param type Limit type
+ */
+ void append(SpeedLimiterItem *item, Type type);
+
+ /**
+ * Removes an item from the speed limiter.
+ *
+ * @param item Item instance
+ */
+ void remove(SpeedLimiterItem *item);
+
+ /**
+ * Removes an item from the speed limiter.
+ *
+ * @param item Item instance
+ * @param type Limit type
+ */
+ void remove(SpeedLimiterItem *item, Type type);
+protected:
+ /**
+ * Static class instance.
+ */
+ static SpeedLimiter *m_self;
+
+ /**
+ * Class constructor.
+ */
+ SpeedLimiter();
+
+ /**
+ * Timer event.
+ */
+ void timerEvent(QTimerEvent*);
+private:
+ bool m_timer;
+ int m_limits[2];
+
+ QPtrList<SpeedLimiterItem> m_objects[2];
+
+ int m_tokenDebt[2];
+private slots:
+ void updateLimits();
+};
+
+/**
+ * This class represents an item managed by the speed limiter. This is
+ * usually a socket.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class SpeedLimiterItem {
+friend class SpeedLimiter;
+public:
+ /**
+ * Class constructor.
+ */
+ SpeedLimiterItem();
+
+ /**
+ * Returns the number of bytes allowed for consumption.
+ */
+ int allowedBytes() const { return m_availableBytes; }
+protected:
+ /**
+ * Updates object's byte usage.
+ */
+ void updateUsage(int bytes);
+private:
+ int m_availableBytes;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/ssl.cpp b/kftpgrabber/src/engine/ssl.cpp
new file mode 100644
index 0000000..92418bb
--- /dev/null
+++ b/kftpgrabber/src/engine/ssl.cpp
@@ -0,0 +1,264 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "ssl.h"
+
+#include <ksocketdevice.h>
+#include <kmdcodec.h>
+#include <ksslx509v3.h>
+
+#include <openssl/ssl.h>
+#include <openssl/x509.h>
+
+#include <unistd.h>
+
+namespace KFTPEngine {
+
+class Ssl::Private {
+public:
+ Private()
+ : ssl(0), sslCtx(0), bio(0)
+ {
+ }
+
+ bool initialized;
+
+ SSL *ssl;
+ SSL_CTX *sslCtx;
+ BIO *bio;
+ X509 *certificate;
+};
+
+Ssl::Ssl(KNetwork::KStreamSocket *socket)
+ : d(new Ssl::Private()),
+ m_socket(socket)
+{
+ d->ssl = 0;
+ d->sslCtx = 0;
+ d->bio = 0;
+ d->certificate = 0;
+ d->initialized = false;
+
+ initialize();
+}
+
+Ssl::~Ssl()
+{
+ close();
+ delete d;
+}
+
+void Ssl::initialize()
+{
+ if (!d->ssl) {
+ SSL_library_init();
+
+ d->sslCtx = SSL_CTX_new(SSLv23_client_method());
+ d->ssl = SSL_new(d->sslCtx);
+
+ SSL_CTX_set_options(d->sslCtx, SSL_OP_ALL);
+
+ // Initialize the socket BIO
+ d->bio = BIO_new_socket(m_socket->socketDevice()->socket(), BIO_NOCLOSE);
+ SSL_set_bio(d->ssl, d->bio, d->bio);
+ }
+
+ d->initialized = true;
+}
+
+bool Ssl::connect()
+{
+ if (!d->initialized)
+ return false;
+
+retry_connect:
+ int ret = SSL_connect(d->ssl);
+ if (ret == 1) {
+ // Connection established
+ setConnectionInfo();
+ return true;
+ } else {
+ int err = SSL_get_error(d->ssl, ret);
+
+ if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
+retry_poll:
+ bool input;
+ m_socket->socketDevice()->poll(&input, 0, 0, 0);
+
+ if (input)
+ goto retry_connect;
+ else {
+ ::usleep(20000);
+ goto retry_poll;
+ }
+ } else {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool Ssl::setClientCertificate(KSSLPKCS12 *pkcs)
+{
+ if (!pkcs || !pkcs->getCertificate())
+ return false;
+
+ int ret;
+ X509 *x;
+ EVP_PKEY *k = pkcs->getPrivateKey();
+ QCString cert = QCString(pkcs->getCertificate()->toString().ascii());
+
+ QByteArray qba, qbb = cert.copy();
+ KCodecs::base64Decode(qbb, qba);
+#if OPENSSL_VERSION_NUMBER > 0x009070afL
+ const unsigned char *qbap = reinterpret_cast<unsigned char *>(qba.data());
+#else
+ unsigned char *qbap = reinterpret_cast<unsigned char *>(qba.data());
+#endif
+ x = d2i_X509(NULL, &qbap, qba.size());
+
+ if (!x || !k)
+ return false;
+
+ if (!pkcs->getCertificate()->x509V3Extensions().certTypeSSLClient())
+ return false;
+
+ ret = SSL_CTX_use_certificate(d->sslCtx, x);
+ if (ret <= 0)
+ return false;
+
+ ret = SSL_CTX_use_PrivateKey(d->sslCtx, k);
+ if (ret <= 0)
+ return false;
+
+ return true;
+}
+
+void Ssl::setConnectionInfo()
+{
+ SSL_CIPHER *cipher;
+ char buffer[1024];
+
+ buffer[0] = 0;
+ cipher = SSL_get_current_cipher(d->ssl);
+
+ if (!cipher)
+ return;
+
+ m_connectionInfo.m_cipherUsedBits = SSL_CIPHER_get_bits(cipher, &(m_connectionInfo.m_cipherBits));
+ m_connectionInfo.m_cipherVersion = SSL_CIPHER_get_version(cipher);
+ m_connectionInfo.m_cipherName = SSL_CIPHER_get_name(cipher);
+ m_connectionInfo.m_cipherDescription = SSL_CIPHER_description(cipher, buffer, 1023);
+}
+
+SslConnectionInfo &Ssl::connectionInfo()
+{
+ return m_connectionInfo;
+}
+
+void Ssl::close()
+{
+ if (!d->initialized)
+ return;
+
+ if (d->certificate) {
+ X509_free(d->certificate);
+ d->certificate = 0;
+ }
+
+ if (d->ssl) {
+ SSL_shutdown(d->ssl);
+ SSL_free(d->ssl);
+ SSL_CTX_free(d->sslCtx);
+
+ d->ssl = 0;
+ d->sslCtx = 0;
+ d->bio = 0;
+ }
+}
+
+int Ssl::read(void *buffer, int bytes)
+{
+ if (!d->initialized)
+ return -1;
+
+ int ret = SSL_read(d->ssl, buffer, bytes);
+
+ if (ret <= 0) {
+ int err = SSL_get_error(d->ssl, ret);
+
+ if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE)
+ return 0;
+ else
+ return -1;
+ }
+
+ return ret;
+}
+
+int Ssl::write(void *buffer, int bytes)
+{
+ if (!d->initialized)
+ return -1;
+
+retry_write:
+ int ret = SSL_write(d->ssl, buffer, bytes);
+
+ if (ret <= 0) {
+ int err = SSL_get_error(d->ssl, ret);
+
+ if (err == SSL_ERROR_WANT_READ) {
+retry_poll:
+ bool input;
+ m_socket->socketDevice()->poll(&input, 0, 0, 0);
+
+ if (input)
+ goto retry_write;
+ else {
+ ::usleep(20000);
+ goto retry_poll;
+ }
+ } else if (err == SSL_ERROR_WANT_WRITE) {
+ return -1;
+ } else {
+ return -1;
+ }
+ }
+
+ return ret;
+}
+
+}
diff --git a/kftpgrabber/src/engine/ssl.h b/kftpgrabber/src/engine/ssl.h
new file mode 100644
index 0000000..e0933ed
--- /dev/null
+++ b/kftpgrabber/src/engine/ssl.h
@@ -0,0 +1,176 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPENGINESSL_H
+#define KFTPENGINESSL_H
+
+#include <kstreamsocket.h>
+#include <ksslcertificate.h>
+#include <ksslpkcs12.h>
+
+namespace KFTPEngine {
+
+/**
+ * This class contains information about the currently established SSL
+ * connection.
+ *
+ * @author Jernej Kos
+ */
+class SslConnectionInfo {
+friend class Ssl;
+public:
+ /**
+ * Get the cipher in use.
+ */
+ const QString &getCipher() const { return m_cipherName; }
+
+ /**
+ * Describe the cipher in use.
+ */
+ const QString &getCipherDescription() const { return m_cipherDescription; }
+
+ /**
+ * Get the version of the cipher in use.
+ */
+ const QString &getCipherVersion() const { return m_cipherVersion; }
+
+ /**
+ * Get the number of bits of the cipher that are actually used.
+ */
+ int getCipherUsedBits() const { return m_cipherUsedBits; }
+
+ /**
+ * Get bit-size of the cipher.
+ */
+ int getCipherBits() const { return m_cipherBits; }
+protected:
+ /**
+ * Class constructor.
+ */
+ SslConnectionInfo() {}
+
+ int m_cipherUsedBits;
+ int m_cipherBits;
+
+ QString m_cipherName;
+ QString m_cipherDescription;
+ QString m_cipherVersion;
+};
+
+/**
+ * A class that properly handles asynchronious SSL connections.
+ *
+ * @author Jernej Kos
+ */
+class Ssl {
+public:
+ /**
+ * Class constructor.
+ *
+ * @param socket The socket to use as transport
+ */
+ Ssl(KNetwork::KStreamSocket *socket);
+
+ /**
+ * Class destructor.
+ */
+ ~Ssl();
+
+ /**
+ * Start the SSL handshake. This method will block until the
+ * handshake is completed.
+ *
+ * @return True if the handshake was successful, false otherwise
+ */
+ bool connect();
+
+ /**
+ * Close the SSL connection and deallocate resources.
+ */
+ void close();
+
+ /**
+ * Read from the underlying socket.
+ *
+ * @param buffer The tarrget buffer
+ * @param bytes Maximum number of bytes to read
+ * @return Number of bytes actually read or -1 in case of an error
+ */
+ int read(void *buffer, int bytes);
+
+ /**
+ * Write to the underlying socket.
+ *
+ * @param buffer The source buffer
+ * @param bytes Number of bytes to write
+ * @return Number of bytes actually written or -1 in case of an error
+ */
+ int write(void *buffer, int bytes);
+
+ /**
+ * Obtain a reference to the connection information.
+ *
+ * @return A reference ot the connection information, valid after connected
+ */
+ SslConnectionInfo &connectionInfo();
+
+ /**
+ * Set the client certificate to use.
+ *
+ * @return True if the certificate was successfuly set
+ */
+ bool setClientCertificate(KSSLPKCS12 *pkcs);
+private:
+ class Private;
+ Private *d;
+
+ KNetwork::KStreamSocket *m_socket;
+ SslConnectionInfo m_connectionInfo;
+protected:
+ /**
+ * Initialize the SSL session for operation.
+ */
+ void initialize();
+
+ /**
+ * Populate the connection info object with data retrieved from the SSL
+ * socket. Note that the socket has to be connected!
+ */
+ void setConnectionInfo();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/engine/thread.cpp b/kftpgrabber/src/engine/thread.cpp
new file mode 100644
index 0000000..3e151b5
--- /dev/null
+++ b/kftpgrabber/src/engine/thread.cpp
@@ -0,0 +1,346 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "thread.h"
+#include "ftpsocket.h"
+#include "sftpsocket.h"
+
+#include <qapplication.h>
+
+namespace KFTPEngine {
+
+Thread::Thread()
+ : QThread(),
+ m_eventHandler(new EventHandler(this)),
+ m_socket(0),
+ m_wakeupEvent(0),
+ m_abortLoop(false),
+ m_wakeUpPending(false)
+{
+ m_protocolMap.insert("ftp", new FtpSocket(this));
+ m_protocolMap.insert("sftp", new SftpSocket(this));
+
+ // FTP is the default protocol
+ m_socket = m_protocolMap["ftp"];
+
+ // Auto start the thread
+ start();
+}
+
+Thread::~Thread()
+{
+ m_abortLoop = true;
+
+ if (!wait(1000))
+ terminate();
+
+ // Destroy all protocol sockets
+ delete static_cast<FtpSocket*>(m_protocolMap["ftp"]);
+ delete static_cast<SftpSocket*>(m_protocolMap["sftp"]);
+
+ m_protocolMap.clear();
+}
+
+void Thread::run()
+{
+ while (!m_abortLoop) {
+ QThread::usleep(100);
+
+ // "Poll" the socket
+ m_socket->poll();
+
+ // Transmit wakeup events if any
+ if (m_wakeUpPending && m_socket->isBusy()) {
+ m_wakeupMutex.lock();
+ m_socket->wakeup(m_wakeupEvent);
+
+ delete m_wakeupEvent;
+ m_wakeupEvent = 0;
+ m_wakeUpPending = false;
+ m_wakeupMutex.unlock();
+ }
+
+ // Execute any pending commands if the socket isn't busy
+ if (!m_commandQueue.empty()) {
+ m_queueMutex.lock();
+
+ QValueList<Commands::Type>::iterator queueEnd = m_commandQueue.end();
+ for (QValueList<Commands::Type>::iterator i = m_commandQueue.begin(); i != queueEnd; ++i) {
+ Commands::Type cmdType = *i;
+
+ // Execute the command
+ if (cmdType == Commands::CmdNext) {
+ m_commandQueue.remove(i--);
+ m_socket->nextCommand();
+ } else if (!m_socket->isBusy()) {
+ m_commandQueue.remove(i--);
+ m_socket->setCurrentCommand(cmdType);
+
+ switch (cmdType) {
+ case Commands::CmdConnect: {
+ m_socket->protoConnect(nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdDisconnect: {
+ m_socket->protoDisconnect();
+ break;
+ }
+ case Commands::CmdList: {
+ m_socket->protoList(nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdScan: {
+ m_socket->protoScan(nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdGet: {
+ m_socket->protoGet(nextCommandParameter().asUrl(),
+ nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdPut: {
+ m_socket->protoPut(nextCommandParameter().asUrl(),
+ nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdDelete: {
+ m_socket->protoDelete(nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdRename: {
+ m_socket->protoRename(nextCommandParameter().asUrl(),
+ nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdChmod: {
+ m_socket->protoChmod(nextCommandParameter().asUrl(),
+ nextCommandParameter().asFileSize(),
+ nextCommandParameter().asBoolean());
+ break;
+ }
+ case Commands::CmdMkdir: {
+ m_socket->protoMkdir(nextCommandParameter().asUrl());
+ break;
+ }
+ case Commands::CmdRaw: {
+ m_socket->protoRaw(nextCommandParameter().asString());
+ break;
+ }
+ case Commands::CmdFxp: {
+ m_socket->protoSiteToSite(static_cast<Socket*>(nextCommandParameter().asData()),
+ nextCommandParameter().asUrl(),
+ nextCommandParameter().asUrl());
+ break;
+ }
+ default: {
+ // Just ignore unknown commands for now
+ break;
+ }
+ }
+ }
+ }
+
+ m_queueMutex.unlock();
+ }
+ }
+}
+
+void Thread::wakeup(WakeupEvent *event)
+{
+ QMutexLocker locker(&m_wakeupMutex);
+
+ m_wakeupEvent = event;
+ m_wakeUpPending = true;
+}
+
+void Thread::abort()
+{
+ // Clear any pending wakeup events
+ if (m_wakeUpPending) {
+ QMutexLocker locker(&m_wakeupMutex);
+
+ m_wakeupEvent = 0;
+ m_wakeUpPending = false;
+ }
+
+ m_socket->protoAbort();
+}
+
+void Thread::event(Event::Type type, QValueList<EventParameter> params)
+{
+ if (m_eventHandler) {
+ Event *e = new Event(type, params);
+ qApp->postEvent(m_eventHandler, e);
+ }
+}
+
+void Thread::selectSocketForProtocol(const KURL &url)
+{
+ if (url.protocol() == m_socket->protocolName())
+ return;
+
+ // Change the socket if one exists
+ Socket *socket = m_protocolMap.find(url.protocol());
+ if (socket)
+ m_socket = socket;
+}
+
+EventParameter Thread::nextCommandParameter()
+{
+ QMutexLocker locker(&m_paramsMutex);
+ EventParameter param = m_commandParams.front();
+ m_commandParams.pop_front();
+
+ return param;
+}
+
+void Thread::connect(const KURL &url)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ // Setup the correct socket to use for connection
+ selectSocketForProtocol(url);
+
+ m_commandQueue.append(Commands::CmdConnect);
+ m_commandParams.append(EventParameter(url));
+}
+
+void Thread::disconnect()
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdDisconnect);
+}
+
+void Thread::list(const KURL &url)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdList);
+ m_commandParams.append(EventParameter(url));
+}
+
+void Thread::scan(const KURL &url)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdScan);
+ m_commandParams.append(EventParameter(url));
+}
+
+void Thread::get(const KURL &source, const KURL &destination)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdGet);
+ m_commandParams.append(EventParameter(destination));
+ m_commandParams.append(EventParameter(source));
+}
+
+void Thread::put(const KURL &source, const KURL &destination)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdPut);
+ m_commandParams.append(EventParameter(destination));
+ m_commandParams.append(EventParameter(source));
+}
+
+void Thread::remove(const KURL &url)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdDelete);
+ m_commandParams.append(EventParameter(url));
+}
+
+void Thread::rename(const KURL &source, const KURL &destination)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdRename);
+ m_commandParams.append(EventParameter(destination));
+ m_commandParams.append(EventParameter(source));
+}
+
+void Thread::chmod(const KURL &url, int mode, bool recursive)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdChmod);
+ m_commandParams.append(EventParameter(recursive));
+ m_commandParams.append(EventParameter(mode));
+ m_commandParams.append(EventParameter(url));
+}
+
+void Thread::mkdir(const KURL &url)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdMkdir);
+ m_commandParams.append(EventParameter(url));
+}
+
+void Thread::raw(const QString &raw)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdRaw);
+ m_commandParams.append(EventParameter(raw));
+}
+
+void Thread::siteToSite(Thread *thread, const KURL &source, const KURL &destination)
+{
+ QMutexLocker locker(&m_paramsMutex);
+ QMutexLocker lockerq(&m_queueMutex);
+
+ m_commandQueue.append(Commands::CmdFxp);
+ m_commandParams.append(EventParameter(destination));
+ m_commandParams.append(EventParameter(source));
+ m_commandParams.append(EventParameter(thread->socket()));
+}
+
+}
diff --git a/kftpgrabber/src/engine/thread.h b/kftpgrabber/src/engine/thread.h
new file mode 100644
index 0000000..62a36c4
--- /dev/null
+++ b/kftpgrabber/src/engine/thread.h
@@ -0,0 +1,133 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPENGINETHREAD_H
+#define KFTPENGINETHREAD_H
+
+#include <qthread.h>
+#include <qmutex.h>
+#include <qvaluelist.h>
+#include <qdict.h>
+
+#include "event.h"
+#include "directorylisting.h"
+#include "commands.h"
+#include "socket.h"
+
+namespace KFTPEngine {
+
+/**
+ * This class represents a socket thread. It serves as a command queue to
+ * the underlying socket implementation and also as an abstraction layer
+ * to support multiple protocols.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class Thread : public QThread
+{
+friend class EventHandler;
+friend class Socket;
+public:
+ Thread();
+ ~Thread();
+
+ /**
+ * Returns the event handler for this thread. Should be used to connect
+ * to any signals this thread may emit.
+ *
+ * @return A pointer to the EventHandler object
+ */
+ EventHandler *eventHandler() { return m_eventHandler; }
+
+ /**
+ * Returns the underlying socket object.
+ *
+ * @return A pointer to the Socket object
+ */
+ Socket *socket() { return m_socket; }
+
+ /**
+ * Prepare the apropriate socket for use.
+ *
+ * @param url The url that should be used to identify the protocol
+ */
+ void selectSocketForProtocol(const KURL &url);
+
+ /**
+ * Schedules a wakeup event to be passed on to the underlying socket.
+ *
+ * @param event The wakeup event to pass on
+ */
+ void wakeup(WakeupEvent *event);
+
+ void abort();
+ void connect(const KURL &url);
+ void disconnect();
+ void list(const KURL &url);
+ void scan(const KURL &url);
+ void get(const KURL &source, const KURL &destination);
+ void put(const KURL &source, const KURL &destination);
+ void remove(const KURL &url);
+ void rename(const KURL &source, const KURL &destination);
+ void chmod(const KURL &url, int mode, bool recursive = false);
+ void mkdir(const KURL &url);
+ void raw(const QString &raw);
+ void siteToSite(Thread *thread, const KURL &source, const KURL &destination);
+protected:
+ void run();
+ void event(Event::Type type, QValueList<EventParameter> params);
+
+ EventParameter nextCommandParameter();
+protected:
+ EventHandler *m_eventHandler;
+ Socket *m_socket;
+
+ QMutex m_eventMutex;
+ QMutex m_wakeupMutex;
+ QMutex m_paramsMutex;
+ QMutex m_queueMutex;
+
+ QDict<Socket> m_protocolMap;
+ QValueList<Commands::Type> m_commandQueue;
+ QValueList<EventParameter> m_commandParams;
+ WakeupEvent *m_wakeupEvent;
+
+ bool m_abortLoop;
+ bool m_wakeUpPending;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/hi16-app-kftpgrabber.png b/kftpgrabber/src/hi16-app-kftpgrabber.png
new file mode 100644
index 0000000..d529947
--- /dev/null
+++ b/kftpgrabber/src/hi16-app-kftpgrabber.png
Binary files differ
diff --git a/kftpgrabber/src/hi22-app-kftpgrabber.png b/kftpgrabber/src/hi22-app-kftpgrabber.png
new file mode 100644
index 0000000..e58a6b6
--- /dev/null
+++ b/kftpgrabber/src/hi22-app-kftpgrabber.png
Binary files differ
diff --git a/kftpgrabber/src/hi32-app-kftpgrabber.png b/kftpgrabber/src/hi32-app-kftpgrabber.png
new file mode 100644
index 0000000..ebdef81
--- /dev/null
+++ b/kftpgrabber/src/hi32-app-kftpgrabber.png
Binary files differ
diff --git a/kftpgrabber/src/hi48-app-kftpgrabber.png b/kftpgrabber/src/hi48-app-kftpgrabber.png
new file mode 100644
index 0000000..d26533c
--- /dev/null
+++ b/kftpgrabber/src/hi48-app-kftpgrabber.png
Binary files differ
diff --git a/kftpgrabber/src/hi64-app-kftpgrabber.png b/kftpgrabber/src/hi64-app-kftpgrabber.png
new file mode 100644
index 0000000..9cd1acd
--- /dev/null
+++ b/kftpgrabber/src/hi64-app-kftpgrabber.png
Binary files differ
diff --git a/kftpgrabber/src/kftpbookmarkaction.cpp b/kftpgrabber/src/kftpbookmarkaction.cpp
new file mode 100644
index 0000000..60d4904
--- /dev/null
+++ b/kftpgrabber/src/kftpbookmarkaction.cpp
@@ -0,0 +1,62 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpbookmarkaction.h"
+
+KFTPWalletAction::KFTPWalletAction(const QString &text, const QString &pix, const KShortcut &cut, const QObject *receiver, const char *slot, KActionCollection *parent, const char *name)
+ : KAction(text, pix, cut, receiver, slot, parent, name)
+{
+}
+
+KFTPZeroconfAction::KFTPZeroconfAction(const QString &text, const QString &pix, const KShortcut &cut, const QObject *receiver, const char *slot, KActionCollection *parent, const char *name)
+ : KAction(text, pix, cut, receiver, slot, parent, name)
+{
+}
+
+#if KDE_IS_VERSION(3,4,0)
+void KFTPZeroconfAction::setSite(DNSSD::RemoteService::Ptr service)
+{
+ m_service = service;
+}
+#endif
+
+KFTPBookmarkAction::KFTPBookmarkAction(const QString &text, const QString &pix, const KShortcut &cut, const QObject *receiver, const char *slot, KActionCollection *parent, const char *name)
+ : KAction(text, pix, cut, receiver, slot, parent, name)
+{
+ m_data = 0L;
+}
+
+
+#include "kftpbookmarkaction.moc"
diff --git a/kftpgrabber/src/kftpbookmarkaction.h b/kftpgrabber/src/kftpbookmarkaction.h
new file mode 100644
index 0000000..91b245c
--- /dev/null
+++ b/kftpgrabber/src/kftpbookmarkaction.h
@@ -0,0 +1,113 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKACTION_H
+#define KFTPBOOKMARKACTION_H
+
+#include <kaction.h>
+#include <kurl.h>
+#include <kdeversion.h>
+
+#include <qdom.h>
+
+#if KDE_IS_VERSION(3,4,0)
+#include "kftpzeroconf.h"
+#endif
+
+namespace KFTPBookmarks {
+ class Site;
+}
+
+/**
+ * This class represents a bookmark KAction that executes a connection to
+ * the bookmarked site.
+ *
+ * @author Jernej Kos
+ */
+class KFTPWalletAction : public KAction
+{
+Q_OBJECT
+public:
+ KFTPWalletAction(const QString &text, const QString &pix, const KShortcut &cut, const QObject *receiver, const char *slot, KActionCollection *parent, const char *name = 0);
+
+ void setSite(const KURL &site) { m_site = site; };
+ KURL getSite() { return m_site; }
+private:
+ KURL m_site;
+};
+
+/**
+ * This class represents a zeroconf KAction that executes a connection to
+ * the zeroconf resolved site.
+ *
+ * @author Jernej Kos
+ */
+class KFTPZeroconfAction : public KAction
+{
+Q_OBJECT
+public:
+ KFTPZeroconfAction(const QString &text, const QString &pix, const KShortcut &cut, const QObject *receiver, const char *slot, KActionCollection *parent, const char *name = 0);
+
+#if KDE_IS_VERSION(3,4,0)
+ void setSite(DNSSD::RemoteService::Ptr service);
+ DNSSD::RemoteService::Ptr getSite() { return m_service; }
+private:
+ DNSSD::RemoteService::Ptr m_service;
+#endif
+};
+
+/**
+ * This class represents a bookmark KAction that executes a connection to
+ * the bookmarked site.
+ *
+ * @author Jernej Kos
+ */
+class KFTPBookmarkAction : public KAction
+{
+Q_OBJECT
+public:
+ KFTPBookmarkAction(const QString &text, const QString &pix, const KShortcut &cut, const QObject *receiver, const char *slot, KActionCollection *parent, const char *name = 0);
+
+ void setSiteId(const QString &id) { m_siteId = id; }
+ void setData(QObject *data) { m_data = data; }
+
+ QObject *data() { return m_data; }
+ QString siteId() { return m_siteId; }
+private:
+ QObject *m_data;
+ QString m_siteId;
+};
+
+#endif
diff --git a/kftpgrabber/src/kftpbookmarks.cpp b/kftpgrabber/src/kftpbookmarks.cpp
new file mode 100644
index 0000000..0211ac6
--- /dev/null
+++ b/kftpgrabber/src/kftpbookmarks.cpp
@@ -0,0 +1,948 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpbookmarks.h"
+#include "kftpbookmarkaction.h"
+#include "kftpqueue.h"
+#include "kftpapi.h"
+#include "kftpwalletconnection.h"
+#include "misc.h"
+#include "desencryptor.h"
+#include "browser/view.h"
+#include "kftpsession.h"
+#include "bookmarks/listview.h"
+
+#include "misc/config.h"
+#include "engine/thread.h"
+#include "engine/ftpsocket.h"
+
+#include <qfile.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kpassdlg.h>
+#include <kmessagebox.h>
+#include <kdeversion.h>
+#include <kapplication.h>
+#include <kio/passdlg.h>
+#include <kstaticdeleter.h>
+
+/* KSSL includes */
+#include <ksslpkcs12.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPBookmarks {
+
+Site::Site(QDomNode node)
+ : m_element(node.toElement())
+{
+ // generate id if it is not present!
+ if (m_element.tagName() == "category") {
+ m_type = ST_CATEGORY;
+
+ if (getAttribute("id").isEmpty())
+ setAttribute("id", QString("cat-%1").arg(KApplication::randomString(7)));
+ } else if (m_element.tagName() == "server") {
+ m_type = ST_SITE;
+
+ if (getAttribute("id").isEmpty())
+ setAttribute("id", QString("site-%1").arg(KApplication::randomString(7)));
+ }
+
+ // Set the id
+ m_id = getAttribute("id");
+}
+
+Site::~Site()
+{
+}
+
+Site *Site::duplicate()
+{
+ Site *site = new Site(m_element.cloneNode());
+ site->setAttribute("name", i18n("Copy of") + " " + getAttribute("name"));
+
+ // Assign a new id
+ site->setAttribute("id", QString("site-%1").arg(KApplication::randomString(7)));
+ site->m_id = site->getAttribute("id");
+
+ m_element.parentNode().appendChild(site->m_element);
+
+ return site;
+}
+
+void Site::reparentSite(Site *site)
+{
+ // Move site's parent
+ m_element.appendChild(site->m_element);
+}
+
+Site *Site::addSite(QDomNode node)
+{
+ if (node.isNull()) {
+ // If there was no node specified, create a new one
+ node = m_element.ownerDocument().createElement("server");
+ }
+
+ Site *site = new Site(node);
+ m_element.appendChild(site->m_element);
+
+ return site;
+}
+
+void Site::addCategory(const QString &name)
+{
+ QDomElement cat = m_element.ownerDocument().createElement("category");
+
+ // Assign a new id and name
+ cat.setAttribute("id", QString("cat-%1").arg(KApplication::randomString(7)));
+ cat.setAttribute("name", name);
+
+ m_element.appendChild(cat);
+}
+
+KURL Site::getUrl()
+{
+ KURL url;
+
+ url.setProtocol(getProperty("protocol"));
+ url.setHost(getProperty("host"));
+ url.setPort(getIntProperty("port"));
+ url.setUser(getProperty("username"));
+ url.setPass(getProperty("password"));
+
+ return url;
+}
+
+Site *Site::getParentSite()
+{
+ // Get parent's site id, then search for it
+ QDomElement parent = m_element.parentNode().toElement();
+
+ if (parent.isNull())
+ return NULL;
+ else
+ return KFTPBookmarks::Manager::self()->findCategory(parent.attribute("id"));
+}
+
+QString Site::getProperty(const QString &name)
+{
+ QDomNodeList nodes = m_element.elementsByTagName(name);
+
+ if (nodes.length() > 0) {
+ QString property = nodes.item(0).toElement().text();
+ property.stripWhiteSpace();
+
+ // Automagicly decode passwords from BASE64
+ if (name.contains("pass") == 1)
+ property = decodePassword(property);
+
+ return property;
+ } else {
+ return QString::null;
+ }
+}
+
+int Site::getIntProperty(const QString &name)
+{
+ return getProperty(name).toInt();
+}
+
+void Site::setProperty(const QString &name, const QString &value)
+{
+ // First delete the old property if it exists
+ QDomNodeList nodes = m_element.elementsByTagName(name);
+
+ if (nodes.length() > 0)
+ m_element.removeChild(nodes.item(0));
+
+ // Now add a new one
+ QDomElement property = m_element.ownerDocument().createElement(name);
+ m_element.appendChild(property);
+
+ QDomText text = m_element.ownerDocument().createTextNode(value);
+ property.appendChild(text);
+}
+
+void Site::setProperty(const QString &name, int value)
+{
+ setProperty(name, QString::number(value));
+}
+
+void Site::setAttribute(const QString &name, const QString &value)
+{
+ m_element.setAttribute(name, value);
+}
+
+QString Site::getAttribute(const QString &name)
+{
+ return m_element.attribute(name);
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Manager *Manager::m_self = 0;
+static KStaticDeleter<Manager> staticBookmarkManagerDeleter;
+
+Manager *Manager::self()
+{
+ if (!m_self) {
+ staticBookmarkManagerDeleter.setObject(m_self, new Manager());
+ }
+
+ return m_self;
+}
+
+Manager::Manager()
+ : QObject()
+{
+ // Init the cache
+ m_siteCache.setAutoDelete(true);
+
+ // Init the DOM document
+ m_document = QDomDocument("KFTPGrabber");
+}
+
+Manager::Manager(const Manager &bookmarks)
+ : QObject()
+{
+ // Init the cache
+ m_siteCache.setAutoDelete(true);
+
+ // Init the DOM document
+ m_document = QDomDocument("KFTPGrabber");
+
+ // Copy the bookmarks
+ QDomNode tmp = m_document.importNode(bookmarks.m_document.documentElement(), true);
+ m_document.appendChild(tmp);
+}
+
+Manager::~Manager()
+{
+ if (m_self == this)
+ staticBookmarkManagerDeleter.setObject(m_self, 0, false);
+}
+
+void Manager::setBookmarks(KFTPBookmarks::Manager *bookmarks)
+{
+ // Init the DOM document
+ m_document = QDomDocument("KFTPGrabber");
+
+ QDomNode tmp = m_document.importNode(bookmarks->m_document.documentElement(), true);
+ m_document.appendChild(tmp);
+
+ // Clear the cache
+ m_siteCache.clear();
+
+ emit update();
+}
+
+void Manager::importSites(QDomNode node)
+{
+ QDomNode import = m_document.importNode(node, true);
+ m_document.documentElement().appendChild(import);
+
+ // Run sanity checks to generate missing ids
+ Manager::validate();
+}
+
+void Manager::load(const QString &filename)
+{
+ m_filename = filename;
+
+ QFile file(filename);
+ if (!file.open(IO_ReadOnly)) {
+ // Create a new empty XML
+ m_document.setContent(QString("<sites version=\"%1\"></sites>").arg(KFTP_BOOKMARKS_VERSION));
+
+ return;
+ }
+
+ // Check if the file is encrpyted
+ QCString content(file.readAll());
+
+ if (KFTPCore::Config::encryptBookmarks()) {
+ // File is encrypted
+pwd_entry:
+ int saveToWallet = 1;
+
+ QCString p_pass(KFTPAPI::getInstance()->walletConnection()->getPassword("bookmarkDecryptPwd").ascii());
+ if (QString(p_pass).isNull()) {
+ // Ask the user for a password
+ int ret = KPasswordDialog::getPassword(p_pass, i18n("This bookmark file is encrypted. Please enter key for decryption."), &saveToWallet);
+
+ if (ret != KPasswordDialog::Accepted) {
+ // User pressed cancel
+ p_pass = "";
+ }
+ }
+
+ // Try to decrypt
+ DESEncryptor des;
+ des.setKey(p_pass);
+ des.decrypt(content);
+
+ if (des.output().left(6) != "<sites" && des.output().left(9) != "<!DOCTYPE") {
+ // Clear any saved passwords
+ KFTPAPI::getInstance()->walletConnection()->setPassword("bookmarkDecryptPwd", QString::null);
+
+ if (KMessageBox::warningContinueCancel(
+ KFTPAPI::getInstance()->mainWindow(),
+ i18n("<qt>Bookmark file decryption has failed with provided key. Do you want to <b>overwrite</b> bookmarks with an empty file ?<br><br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks will be lost.</font></qt>"),
+ i18n("Decryption Failed"),
+ KGuiItem(i18n("&Overwrite Bookmarks"))
+ ) != KMessageBox::Continue)
+ {
+ // Request the password again
+ goto pwd_entry;
+ }
+
+ // Create new empty XML
+ m_document.setContent(QString("<sites version=\"%1\"></sites>").arg(KFTP_BOOKMARKS_VERSION));
+
+ file.close();
+ return;
+ }
+
+ // Save the password for later encryption
+ m_decryptKey = p_pass;
+ content = des.output().ascii();
+
+ if (saveToWallet) {
+ // Save the password to KWallet
+ KFTPAPI::getInstance()->walletConnection()->setPassword("bookmarkDecryptPwd", p_pass);
+ }
+ }
+
+ m_document.setContent(QString::fromLocal8Bit(content));
+ file.close();
+
+ // Check for XML document version updates
+ versionUpdate();
+
+ // Document validation
+ Manager::validate();
+
+ // We have just loaded the bookmarks, so update all the menus
+ emit update();
+}
+
+void Manager::save()
+{
+ // Save the new XML file
+ if (m_filename.isEmpty()) {
+ qDebug("WARNING: No open XML file, will NOT save.");
+ return;
+ }
+
+ QFile file(m_filename);
+ if (!file.open(IO_WriteOnly)) {
+ qDebug("WARNING: Unable to open xml for writing!");
+ return;
+ }
+
+ // Should we encrypt the data ?
+ QString content = m_document.toString();
+ if (KFTPCore::Config::encryptBookmarks()) {
+ DESEncryptor des;
+
+ if (m_decryptKey.isEmpty()) {
+ // Ask the user for the password
+ KPasswordDialog::getPassword(m_decryptKey, i18n("Enter key for bookmark file encryption."));
+ }
+
+ des.setKey(m_decryptKey);
+ des.encrypt(content);
+
+ content = des.output();
+ }
+
+ // Write the XML data to the stream
+ QTextStream fileStream(&file);
+ fileStream << content;
+ file.flush();
+ file.close();
+}
+
+void Manager::validate(QDomNode node)
+{
+ if (node.isNull())
+ node = m_document.documentElement();
+
+ QDomNode n = node.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ if (!n.toElement().hasAttribute("id"))
+ n.toElement().setAttribute("id", QString("cat-%1").arg(KApplication::randomString(7)));
+
+ Manager::validate(n);
+ } else if (n.toElement().tagName() == "server") {
+ if (!n.toElement().hasAttribute("id"))
+ n.toElement().setAttribute("id", QString("site-%1").arg(KApplication::randomString(7)));
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+void Manager::versionUpdate()
+{
+ int version = m_document.documentElement().attribute("version").toInt();
+
+ if (version < KFTP_BOOKMARKS_VERSION) {
+ // Conversion from an old bookmark file
+ qDebug("Detected an old (version %d, new version %d) bookmarks file. Starting conversion process...", version, KFTP_BOOKMARKS_VERSION);
+
+ // NOTE: There are no breaks here, since every update method updates to a specific
+ // version. So in order to convert to the most current from the oldest version, all
+ // methods need to be called!
+ switch (version) {
+ case 0:
+ case 1: versionFrom1Update();
+ }
+
+ // Fix the version
+ m_document.documentElement().setAttribute("version", KFTP_BOOKMARKS_VERSION);
+ }
+}
+
+void Manager::versionFrom1Update(QDomNode parent)
+{
+ // The original format had no site ids, so we have to generate them. Also the old
+ // format used something wierd called "options", we have to convert them as well.
+ // The username/password fields now have differend names.
+
+ if (parent.isNull())
+ parent = m_document.documentElement();
+
+ QDomNode n = parent.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ // Update the category id and all children
+ n.toElement().setAttribute("id", QString("cat-%1").arg(KApplication::randomString(7)));
+
+ versionFrom1Update(n);
+ } else if (n.toElement().tagName() == "server") {
+ // Update the server id
+ n.toElement().setAttribute("id", QString("site-%1").arg(KApplication::randomString(7)));
+
+ // Convert the "options"
+ QDomNodeList nodes = n.toElement().elementsByTagName("option");
+
+ if (nodes.length() > 0) {
+ for (unsigned int i = 0; i < nodes.count(); i++) {
+ QDomNode node = nodes.item(i);
+
+ // Add a new standard property
+ QDomElement property = m_document.createElement(node.toElement().attribute("name"));
+ n.appendChild(property);
+
+ QDomText text = m_document.createTextNode(node.toElement().attribute("value"));
+ property.appendChild(text);
+
+ // And remove the option :>
+ node.parentNode().removeChild(node);
+ i--;
+ }
+ }
+
+ // Rename the username/password fields
+ nodes = n.toElement().elementsByTagName("downuser");
+ if (nodes.length() > 0) {
+ for (unsigned int i = 0; i < nodes.count(); i++) {
+ QDomNode node = nodes.item(i);
+ node.toElement().setTagName("username");
+ }
+ }
+
+ nodes = n.toElement().elementsByTagName("downpass");
+ if (nodes.length() > 0) {
+ for (unsigned int i = 0; i < nodes.count(); i++) {
+ QDomNode node = nodes.item(i);
+ node.toElement().setTagName("password");
+ }
+ }
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+Site *Manager::findSite(const KURL &url)
+{
+ // Find the node, then see if it is already present in the cache
+ QDomNode siteElement = findSiteElementByUrl(url);
+
+ if (!siteElement.isNull()) {
+ // Try to get a cached version
+ Site *site = m_siteCache.find(siteElement.toElement().attribute("id"));
+
+ if (!site) {
+ site = new Site(siteElement);
+ m_siteCache.insert(siteElement.toElement().attribute("id"), site);
+ }
+
+ return site;
+ } else {
+ return NULL;
+ }
+}
+
+Site *Manager::findSite(const QString &id)
+{
+ if (id.isNull())
+ return NULL;
+
+ // Try the cache first
+ Site *site = m_siteCache.find(id);
+
+ if (!site) {
+ // The site was not found, search in the DOM tree and add it to the
+ // cache if found.
+ QDomNode siteElement = findSiteElementById(id);
+
+ if (siteElement.isNull()) {
+ qDebug("WARNING: Unable to find site with id '%s'!", id.ascii());
+
+ return NULL;
+ }
+
+ site = new Site(siteElement);
+ m_siteCache.insert(id, site);
+ }
+
+ return site;
+}
+
+QDomNode Manager::findSiteElementByUrl(const KURL &url, QDomNode parent)
+{
+ if (parent.isNull())
+ parent = m_document.documentElement();
+
+ QDomNode n = parent.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ // Check the category
+ QDomNode site = findSiteElementByUrl(url, n);
+
+ if (!site.isNull())
+ return site;
+ } else if (n.toElement().tagName() == "server") {
+ // Check if the server matches
+ Site *tmp = new Site(n);
+
+ if (tmp->getProperty("host") == url.host() &&
+ tmp->getIntProperty("port") == url.port() &&
+ tmp->getProperty("username") == url.user() &&
+ tmp->getProperty("password") == url.pass())
+ {
+ delete tmp;
+ return n;
+ }
+
+ delete tmp;
+ }
+
+ n = n.nextSibling();
+ }
+
+ return QDomNode();
+}
+
+QDomNode Manager::findSiteElementById(const QString &id, QDomNode parent)
+{
+ if (parent.isNull())
+ parent = m_document.documentElement();
+
+ QDomNode n = parent.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ // Check the category
+ QDomNode site = findSiteElementById(id, n);
+
+ if (!site.isNull())
+ return site;
+ } else if (n.toElement().tagName() == "server") {
+ // Check if the server matches
+ if (n.toElement().attribute("id") == id)
+ return n;
+ }
+
+ n = n.nextSibling();
+ }
+
+ return QDomNode();
+}
+
+QDomNode Manager::findCategoryElementById(const QString &id, QDomNode parent)
+{
+ if (id == "root")
+ return m_document.documentElement();
+
+ if (parent.isNull())
+ parent = m_document.documentElement();
+
+ QDomNode n = parent.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ if (n.toElement().attribute("id") == id)
+ return n;
+
+ // Check the category
+ QDomNode site = findCategoryElementById(id, n);
+
+ if (!site.isNull())
+ return site;
+ }
+
+ n = n.nextSibling();
+ }
+
+ return QDomNode();
+}
+
+Site *Manager::findCategory(const QString &id)
+{
+ // Try the cache first
+ Site *site = m_siteCache.find(id);
+
+ if (!site) {
+ // The site was not found, search in the DOM tree and add it to the
+ // cache if found.
+ QDomNode siteElement = findCategoryElementById(id);
+
+ if (siteElement.isNull()) {
+ qDebug("WARNING: Unable to find category with id '%s'!", id.ascii());
+
+ return NULL;
+ }
+
+ site = new Site(siteElement);
+ m_siteCache.insert(id, site);
+ }
+
+ return site;
+}
+
+Site *Manager::addSite(Site *category, QDomNode node)
+{
+ if (category)
+ return category->addSite(node);
+
+ return NULL;
+}
+
+void Manager::delSite(Site *site)
+{
+ // Remove the node from the DOM tree
+ site->m_element.parentNode().removeChild(site->m_element);
+
+ // Remove the site from cache and it will be automaticly deleted
+ m_siteCache.remove(site->id());
+
+ emit update();
+}
+
+void Manager::setupClient(Site *site, KFTPEngine::Thread *client)
+{
+ if (site) {
+ // First activate the correct socket and reset the old flags
+ client->selectSocketForProtocol(KURL(QString("%1://test/").arg(site->getProperty("protocol"))));
+ client->socket()->initConfig();
+
+ int retryTime = site->getIntProperty("retrytime");
+ int retryCnt = site->getIntProperty("retrycount");
+
+ if (retryTime != 0) {
+ client->socket()->setConfig("retry", 1);
+ client->socket()->setConfig("max_retries", retryCnt);
+ client->socket()->setConfig("retry_delay", retryTime);
+ } else {
+ client->socket()->setConfig("retry", 0);
+ }
+
+ client->socket()->setConfig("keepalive.enabled", site->getIntProperty("doKeepalive"));
+ client->socket()->setConfig("keepalive.timeout", site->getIntProperty("keepaliveTimeout"));
+
+ client->socket()->setConfig("ssl.use_tls", site->getIntProperty("use_tls"));
+ client->socket()->setConfig("ssl.use_implicit", site->getIntProperty("use_implicit"));
+ client->socket()->setConfig("ssl.prot_mode", site->getProperty("tls_data_mode"));
+ client->socket()->setConfig("feat.pasv", site->getIntProperty("disablePASV") == 1 ? 0 : 1);
+ client->socket()->setConfig("feat.epsv", site->getIntProperty("disableEPSV") == 1 ? 0 : 1);
+ client->socket()->setConfig("pasv.use_site_ip", site->getIntProperty("pasvSiteIp"));
+ client->socket()->setConfig("active.no_force_ip", site->getIntProperty("disableForceIp"));
+ client->socket()->setConfig("stat_listings", site->getIntProperty("statListings"));
+ client->socket()->setConfig("encoding", site->getProperty("encoding"));
+
+ // Should we use a X509 certificate ?
+ if (site->getIntProperty("use_cert") && site->getProperty("protocol") == "ftp") {
+ // Ask the user for the decryption password
+ QCString certPass;
+ KPasswordDialog::getPassword(certPass, i18n("Please provide your X509 certificate decryption password."));
+
+ static_cast<KFTPEngine::FtpSocket*>(client->socket())->setSslClientCertificate(KSSLPKCS12::loadCertFile(site->getProperty("tls_cert_path"), certPass));
+ }
+ } else {
+ // Just reset the client, since we don't know the config
+ client->socket()->initConfig();
+ }
+}
+
+void Manager::guiPopulateBookmarksTree(KFTPWidgets::Bookmarks::ListView *tree, QDomNode parent, KFTPWidgets::Bookmarks::ListViewItem *item)
+{
+ if (parent.isNull()) {
+ // Clear the tree and set the parent
+ tree->clear();
+ parent = m_document.documentElement();
+ }
+
+ QDomNode n = parent.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ // Add a submenu
+ KFTPWidgets::Bookmarks::ListViewItem *cat;
+ Site *site = findCategory(n.toElement().attribute("id"));
+
+ if (!item)
+ cat = new KFTPWidgets::Bookmarks::ListViewItem(tree, site->getAttribute("name"));
+ else
+ cat = new KFTPWidgets::Bookmarks::ListViewItem(item, site->getAttribute("name"));
+
+ cat->setType(0);
+ cat->setSite(site);
+
+ cat->setPixmap(0, loadSmallPixmap("bookmark_folder"));
+ guiPopulateBookmarksTree(tree, n, cat);
+ } else if (n.toElement().tagName() == "server") {
+ KFTPWidgets::Bookmarks::ListViewItem *serv;
+ Site *site = findSite(n.toElement().attribute("id"));
+
+ if (!item)
+ serv = new KFTPWidgets::Bookmarks::ListViewItem(tree, site->getAttribute("name"));
+ else
+ serv = new KFTPWidgets::Bookmarks::ListViewItem(item, site->getAttribute("name"));
+
+ serv->setType(1);
+ serv->setSite(site);
+
+ serv->setPixmap(0, loadSmallPixmap("ftp"));
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+void Manager::guiPopulateBookmarksMenu(KActionMenu *parentMenu, QDomNode parentNode, bool base, QObject *data)
+{
+ if (parentNode.isNull())
+ parentNode = m_document.documentElement();
+
+ QDomNode n = parentNode.firstChild();
+ KActionMenu *menu = 0L;
+ KFTPBookmarkAction *action = 0L;
+
+ while (!n.isNull()) {
+ QString name = n.toElement().attribute("name");
+
+ if (n.toElement().tagName() == "category") {
+ menu = new KActionMenu(name, "bookmark_folder", parentMenu);
+ parentMenu->insert(menu, base ? 5 : 0);
+
+ // Fill the menu
+ guiPopulateBookmarksMenu(menu, n, false, data);
+ } else if (n.toElement().tagName() == "server") {
+ action = new KFTPBookmarkAction(name, "ftp", KShortcut(), this, SLOT(slotBookmarkExecuted()), KFTPAPI::getInstance()->mainWindow()->actionCollection());
+ action->setSiteId(n.toElement().attribute("id"));
+ action->setData(data);
+
+ parentMenu->insert(action);
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+void Manager::guiPopulateZeroconfMenu(KActionMenu *parentMenu)
+{
+ // Clear the menu
+ parentMenu->popupMenu()->clear();
+
+#if KDE_IS_VERSION(3,4,0)
+ // Populate
+ QValueList<DNSSD::RemoteService::Ptr> list = KFTPAPI::getInstance()->zeroConfInterface()->getServiceList();
+
+ if (!list.empty()) {
+ QValueList<DNSSD::RemoteService::Ptr>::iterator end(list.end());
+
+ for (QValueList<DNSSD::RemoteService::Ptr>::iterator i(list.begin()); i != end; ++i) {
+ KFTPZeroconfAction *newService = new KFTPZeroconfAction((*i)->serviceName(), "lan", KShortcut(), this, SLOT(slotZeroconfExecuted()), KFTPAPI::getInstance()->mainWindow()->actionCollection());
+ newService->setSite(*i);
+
+ parentMenu->insert(newService);
+ }
+ } else {
+ KAction *disabledAction = new KAction(i18n("<No Services Published>"));
+ disabledAction->setEnabled(false);
+ parentMenu->insert(disabledAction);
+ }
+#else
+ KAction *disabledAction = new KAction(i18n("<DNSSD Not Available>"));
+ disabledAction->setEnabled(false);
+ parentMenu->insert(disabledAction);
+#endif
+}
+
+void Manager::guiPopulateWalletMenu(KActionMenu *parentMenu)
+{
+ // Clear the menu
+ parentMenu->popupMenu()->clear();
+
+ // Populate
+ QValueList<KURL> list = KFTPAPI::getInstance()->walletConnection()->getSiteList();
+
+ if (!list.empty()) {
+ QValueList<KURL>::iterator end(list.end());
+
+ for (QValueList<KURL>::iterator i(list.begin()); i != end; ++i) {
+ QString desc;
+
+ if ((*i).port() != 21)
+ desc = QString("%1@%2:%3").arg((*i).user()).arg((*i).host()).arg((*i).port());
+ else
+ desc = QString("%1@%2").arg((*i).user()).arg((*i).host());
+
+ KFTPWalletAction *newSite = new KFTPWalletAction(desc, "ftp", KShortcut(), this, SLOT(slotWalletExecuted()), KFTPAPI::getInstance()->mainWindow()->actionCollection());
+ newSite->setSite(*i);
+
+ parentMenu->insert(newSite);
+ }
+ } else {
+ KAction *disabledAction = new KAction(i18n("<No Sites In KWallet>"));
+ disabledAction->setEnabled(false);
+ parentMenu->insert(disabledAction);
+ }
+}
+
+void Manager::slotBookmarkExecuted()
+{
+ // Get the sender
+ KFTPBookmarkAction *action = (KFTPBookmarkAction*) QObject::sender();
+ Site *site = findSite(action->siteId());
+
+ // Get the node data from bookmarks
+ KURL siteUrl = site->getUrl();
+
+ // Handle empty usernames and passwords for non-anonymous sites
+ if (!siteUrl.hasUser() || !siteUrl.hasPass() && siteUrl.user() != "anonymous") {
+ KIO::PasswordDialog *dlg = new KIO::PasswordDialog(i18n("Please provide your username and password for connecting to this site."), siteUrl.user(), true);
+ dlg->addCommentLine(i18n("Site:"), QString("%1:%2").arg(siteUrl.host()).arg(siteUrl.port()));
+
+ if (dlg->exec() == KDialogBase::Accepted) {
+ siteUrl.setUser(dlg->username());
+ siteUrl.setPass(dlg->password());
+
+ if (dlg->keepPassword()) {
+ // Save password to the bookmarked site
+ site->setProperty("username", dlg->username());
+ site->setProperty("password", encodePassword(dlg->password()));
+ }
+
+ delete dlg;
+ } else {
+ // Abort connection attempt
+ delete dlg;
+ return;
+ }
+ }
+
+ if (action->data()) {
+ // A specific session was passed on to us
+ KFTPSession::Session *session = static_cast<KFTPSession::Session*>(action->data());
+
+ // Set the correct client for connection
+ KFTPEngine::Thread *client = session->getClient();
+
+ // Now, connect to the server
+ if (client->socket()->isConnected()) {
+ if (KFTPCore::Config::confirmDisconnects() && KMessageBox::warningYesNo(0, i18n("Do you want to drop current connection?")) == KMessageBox::No)
+ return;
+ }
+
+ client->socket()->setCurrentUrl(siteUrl);
+
+ // Set the session's site and connect
+ session->setSite(site);
+ session->reconnect(siteUrl);
+ } else {
+ // Just spawn a new session
+ KFTPSession::Session *session = KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, siteUrl, site);
+ KFTPSession::Manager::self()->setActive(session);
+ }
+}
+
+void Manager::slotWalletExecuted()
+{
+ // Get the sender
+ KFTPWalletAction *action = (KFTPWalletAction*) QObject::sender();
+ KURL siteUrl = action->getSite();
+
+ // Just spawn a new session
+ KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, siteUrl);
+}
+
+void Manager::slotZeroconfExecuted()
+{
+#if KDE_IS_VERSION(3,4,0)
+ // Get the sender
+ KFTPZeroconfAction *action = (KFTPZeroconfAction*) QObject::sender();
+ DNSSD::RemoteService::Ptr service = action->getSite();
+
+ KFTPAPI::getInstance()->mainWindow()->slotQuickConnect(service->serviceName(), service->hostName(), service->port());
+#endif
+}
+
+}
+
+
+#include "kftpbookmarks.moc"
diff --git a/kftpgrabber/src/kftpbookmarks.h b/kftpgrabber/src/kftpbookmarks.h
new file mode 100644
index 0000000..769bb72
--- /dev/null
+++ b/kftpgrabber/src/kftpbookmarks.h
@@ -0,0 +1,160 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKS_H
+#define KFTPBOOKMARKS_H
+
+#include <qstring.h>
+#include <qdom.h>
+#include <qvaluelist.h>
+#include <qcache.h>
+
+#include <kpopupmenu.h>
+#include <kaction.h>
+#include <kurl.h>
+
+namespace KFTPEngine {
+ class Thread;
+}
+
+namespace KFTPWidgets {
+namespace Bookmarks {
+ class ListView;
+ class ListViewItem;
+}
+}
+
+#define KFTP_BOOKMARKS_VERSION 2
+
+namespace KFTPBookmarks {
+
+enum SiteType {
+ ST_SITE,
+ ST_CATEGORY
+};
+
+class Site {
+friend class Manager;
+public:
+ Site(QDomNode node);
+ ~Site();
+
+ void reparentSite(Site *site);
+
+ Site *addSite(QDomNode node = QDomNode());
+ void addCategory(const QString &name);
+
+ KURL getUrl();
+ Site *getParentSite();
+
+ Site *duplicate();
+
+ QString getProperty(const QString &name);
+ int getIntProperty(const QString &name);
+
+ void setProperty(const QString &name, const QString &value);
+ void setProperty(const QString &name, int value);
+
+ void setAttribute(const QString &name, const QString &value);
+ QString getAttribute(const QString &name);
+
+ SiteType type() { return m_type; }
+ QString id() { return m_id; }
+private:
+ SiteType m_type;
+ QString m_id;
+ QDomElement m_element;
+};
+
+class Manager : public QObject {
+Q_OBJECT
+public:
+ static Manager *self();
+ Manager();
+ Manager(const Manager &bookmarks);
+ ~Manager();
+
+ void setBookmarks(KFTPBookmarks::Manager *bookmarks);
+ void importSites(QDomNode node);
+
+ void load(const QString &filename);
+ void save();
+
+ Site *findSite(const QString &id);
+ Site *findSite(const KURL &url) KDE_DEPRECATED;
+
+ Site *findCategory(const QString &id);
+
+ Site *addSite(Site *category, QDomNode node);
+ void delSite(Site *site);
+
+ void setupClient(Site *site, KFTPEngine::Thread *client);
+
+ void guiPopulateBookmarksMenu(KActionMenu *parentMenu, QDomNode parentNode = QDomNode(), bool base = true, QObject *data = 0);
+ void guiPopulateBookmarksTree(KFTPWidgets::Bookmarks::ListView *tree, QDomNode parent = QDomNode(), KFTPWidgets::Bookmarks::ListViewItem *item = 0);
+ void guiPopulateZeroconfMenu(KActionMenu *parentMenu);
+ void guiPopulateWalletMenu(KActionMenu *parentMenu);
+
+ void emitUpdate() { emit update(); }
+protected:
+ static Manager *m_self;
+private:
+ QCache<Site> m_siteCache;
+ QDomDocument m_document;
+
+ QCString m_decryptKey;
+ QString m_filename;
+
+ QDomNode findSiteElementByUrl(const KURL &url, QDomNode parent = QDomNode());
+ QDomNode findSiteElementById(const QString &id, QDomNode parent = QDomNode());
+ QDomNode findCategoryElementById(const QString &id, QDomNode parent = QDomNode());
+
+ // Validation
+ void validate(QDomNode node = QDomNode());
+
+ // XML conversion methods
+ void versionUpdate();
+ void versionFrom1Update(QDomNode parent = QDomNode());
+private slots:
+ void slotBookmarkExecuted();
+ void slotZeroconfExecuted();
+ void slotWalletExecuted();
+signals:
+ void update();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/kftpfileexistsactions.cpp b/kftpgrabber/src/kftpfileexistsactions.cpp
new file mode 100644
index 0000000..d9e7e69
--- /dev/null
+++ b/kftpgrabber/src/kftpfileexistsactions.cpp
@@ -0,0 +1,164 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpfileexistsactions.h"
+
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+
+#include <kdialog.h>
+#include <kcombobox.h>
+#include <klocale.h>
+
+namespace KFTPQueue {
+
+QString &operator<<(QString &s, const FileExistsActions &a)
+{
+ s.truncate(0);
+
+ ActionMap::ConstIterator end( a.m_actions.end() );
+ for (ActionMap::ConstIterator i( a.m_actions.begin() ); i != end; ++i) {
+ s.append(QString("%1;").arg(i.data()));
+ }
+
+ return s;
+}
+
+QString &operator>>(QString &s, FileExistsActions &a)
+{
+ for (unsigned int i = 0; i < 9; i++) {
+ a.m_actions[i+1] = static_cast<FEAction>(s.section(';', i, i).toInt());
+ }
+
+ return s;
+}
+
+QWidget *FileExistsActions::getConfigWidget(QWidget *parent)
+{
+ QGroupBox *gb = new QGroupBox(0, Qt::Vertical, i18n("On File Exists Actions (%1)").arg(m_type), parent);
+ gb->layout()->setSpacing(KDialog::spacingHint());
+ gb->layout()->setMargin(KDialog::marginHint());
+
+ QGridLayout *gl = new QGridLayout(gb->layout(), 5, 4, 5);
+
+ QLabel *l = new QLabel(i18n("Size/Timestamp"), gb);
+ gl->addWidget(l, 1, 0);
+
+ l = new QLabel(i18n("Same"), gb);
+ gl->addWidget(l, 1, 1);
+
+ l = new QLabel(i18n("Older"), gb);
+ gl->addWidget(l, 1, 2);
+
+ l = new QLabel(i18n("Newer"), gb);
+ gl->addWidget(l, 1, 3);
+
+ l = new QLabel(i18n("Same"), gb);
+ gl->addWidget(l, 2, 0);
+
+ l = new QLabel(i18n("Smaller"), gb);
+ gl->addWidget(l, 3, 0);
+
+ l = new QLabel(i18n("Bigger"), gb);
+ gl->addWidget(l, 4, 0);
+
+ for (int row = 0; row < 3; row++) {
+ for (int col = 0; col < 3; col++) {
+ KComboBox *cb = new KComboBox(gb);
+ m_combos[row][col] = cb;
+
+ cb->insertItem(i18n("Skip"));
+ cb->insertItem(i18n("Overwrite"));
+ cb->insertItem(i18n("Resume"));
+ cb->insertItem(i18n("Rename"));
+ cb->insertItem(i18n("Ask"));
+ cb->setCurrentItem(m_actions[row * 3 + col + 1]);
+
+ gl->addWidget(cb, row+2, col+1);
+ }
+ }
+
+ return gb;
+}
+
+void FileExistsActions::updateWidget()
+{
+ for (int row = 0; row < 3; row++) {
+ for (int col = 0; col < 3; col++) {
+ m_combos[row][col]->setCurrentItem(m_actions[row * 3 + col + 1]);
+ }
+ }
+}
+
+void FileExistsActions::updateConfig()
+{
+ for (int row = 0; row < 3; row++) {
+ for (int col = 0; col < 3; col++) {
+ m_actions[row * 3 + col + 1] = static_cast<FEAction>(m_combos[row][col]->currentItem());
+ }
+ }
+}
+
+FEAction FileExistsActions::getActionForSituation(filesize_t src_fileSize, time_t src_fileTimestamp,
+ filesize_t dst_fileSize, time_t dst_fileTimestamp)
+{
+ // There are 9 different scenarios
+ int situation = -1;
+
+ if (dst_fileTimestamp == src_fileTimestamp) {
+ // SAME TIMESTAMP
+ situation = 1;
+ } else if (dst_fileTimestamp < src_fileTimestamp) {
+ // OLDER
+ situation = 2;
+ } else {
+ // NEWER
+ situation = 3;
+ }
+
+ if (dst_fileSize < src_fileSize) {
+ // SMALLER FILE
+ situation += 3;
+ } else if (dst_fileSize > src_fileSize) {
+ // BIGGER FILE
+ situation += 6;
+ }
+
+ // Situation calculated, now get the action
+ return m_actions[situation];
+}
+
+}
diff --git a/kftpgrabber/src/kftpfileexistsactions.h b/kftpgrabber/src/kftpfileexistsactions.h
new file mode 100644
index 0000000..be2fdfe
--- /dev/null
+++ b/kftpgrabber/src/kftpfileexistsactions.h
@@ -0,0 +1,138 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEKFTPFILEEXISTSACTIONS_H
+#define KFTPQUEUEKFTPFILEEXISTSACTIONS_H
+
+#include <sys/types.h>
+
+#include <qwidget.h>
+#include <qmap.h>
+
+typedef unsigned long long int filesize_t;
+
+class KComboBox;
+
+namespace KFTPQueue {
+
+enum FEAction {
+ FE_DISABLE_ACT = -1,
+ FE_SKIP_ACT = 0,
+ FE_OVERWRITE_ACT = 1,
+ FE_RESUME_ACT = 2,
+ FE_RENAME_ACT = 3,
+ FE_USER_ACT = 4
+};
+
+typedef QMap<int, FEAction> ActionMap;
+
+/**
+ * This class provides configurable "on file exists" actions. They are
+ * represented in a 3x3 matrix which determines the 9 possible scenarios.
+ * The matrix goes like this:
+ * <pre>
+ * | SAME TIMESTAMP | OLDER | NEWER
+ * SAME FILESIZE | 1 | 2 | 3
+ * SMALLER | 4 | 5 | 6
+ * BIGGER | 7 | 8 | 9
+ * </pre>
+ *
+ * @author Jernej Kos
+ */
+class FileExistsActions
+{
+public:
+ /**
+ * This method will construct a new widget that will represent
+ * the current status of the overwrite matrix and the ability to
+ * change the values.
+ *
+ * @param parent Widget's parent
+ * @return A new @ref QWidget
+ */
+ QWidget *getConfigWidget(QWidget *parent = 0);
+
+ /**
+ * Set action for a specific file exists situation.
+ *
+ * @param situation Situation (acoording to the above matrix)
+ * @action A FEAction that determines the appropriate action
+ */
+ void setActionForSituation(int situation, FEAction action) { m_actions[situation] = action; }
+
+ /**
+ * Get action for specific file exists situation.
+ *
+ * @param src_fileSize File size of the file that exists
+ * @param src_fileTimestamp File timestamp of the file that exists
+ * @param dst_fileSize File size of the file that will (or not) replace the old one
+ * @param dst_fileTimestamp File timestamp of the file that will (or not) replace the old one
+ * @return An action as @ref FEAction
+ */
+ FEAction getActionForSituation(filesize_t src_fileSize, time_t src_fileTimestamp,
+ filesize_t dst_fileSize, time_t dst_fileTimestamp);
+
+ /**
+ * Sets a text that will be used as type for these actions (like download/upload).
+ *
+ * @param text The text
+ */
+ void setTypeText(const QString &text) { m_type = text; }
+
+ /**
+ * Update the current GUI widget with new settings.
+ */
+ void updateWidget();
+
+ /**
+ * Update the current configuration with the new settings (as dictated by the
+ * GUI).
+ */
+ void updateConfig();
+private:
+ ActionMap m_actions;
+ QString m_type;
+ KComboBox *m_combos[3][3];
+
+ friend QString &operator<<(QString &s, const FileExistsActions &a);
+ friend QString &operator>>(QString &s, FileExistsActions &a);
+};
+
+QString &operator<<(QString &s, const FileExistsActions &a);
+QString &operator>>(QString &s, FileExistsActions &a);
+
+}
+
+#endif
diff --git a/kftpgrabber/src/kftpgrabber-bi-wizard.png b/kftpgrabber/src/kftpgrabber-bi-wizard.png
new file mode 100644
index 0000000..906e4c8
--- /dev/null
+++ b/kftpgrabber/src/kftpgrabber-bi-wizard.png
Binary files differ
diff --git a/kftpgrabber/src/kftpgrabber-logo.png b/kftpgrabber/src/kftpgrabber-logo.png
new file mode 100644
index 0000000..b5ba48c
--- /dev/null
+++ b/kftpgrabber/src/kftpgrabber-logo.png
Binary files differ
diff --git a/kftpgrabber/src/kftpgrabber.desktop b/kftpgrabber/src/kftpgrabber.desktop
new file mode 100644
index 0000000..b26bc06
--- /dev/null
+++ b/kftpgrabber/src/kftpgrabber.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=KFTPGrabber
+Name[sv]=KFTPgrabber
+Name[xx]=xxKFTPGrabberxx
+GenericName=FTP Client
+GenericName[ar]= زبون ميفاق نقل الملفات FTP
+GenericName[bg]=FTP клиент
+GenericName[br]=Kliant FTP
+GenericName[ca]=Client FTP
+GenericName[cs]=FTP klient
+GenericName[cy]=Dibynnydd FTP
+GenericName[da]=FTP klient
+GenericName[de]=FTP-Client
+GenericName[el]=Πελάτης FTP
+GenericName[es]=Cliente de FTP
+GenericName[et]=FTP-klient
+GenericName[fr]=Client FTP
+GenericName[ga]=Cliant FTP
+GenericName[gl]=Cliente FTP
+GenericName[it]=Client FTP
+GenericName[ja]=FTP クライアント
+GenericName[ka]=FTP კლიენტი
+GenericName[lt]=FTP klientas
+GenericName[nl]=FTP-cliënt
+GenericName[pa]=FTP ਕਲਾਂਇਟ
+GenericName[pt]=Cliente de FTP
+GenericName[pt_BR]=Cliente FTP
+GenericName[ru]=Клиент FTP
+GenericName[rw]=Umukiriya FTP
+GenericName[sr]=FTP клијент
+GenericName[sr@Latn]=FTP klijent
+GenericName[sv]=FTP-klient
+GenericName[tr]=FTP İstemcisi
+GenericName[uk]=Клієнт FTP
+GenericName[xh]=Umxhasi we FTP
+GenericName[xx]=xxFTP Clientxx
+GenericName[zh_CN]=FTP 客户端
+GenericName[zu]=Umthengi we FTP
+Comment=A graphical FTP client
+Comment[ar]=زبون رسومي لميفاق نقل الملفات
+Comment[bg]=Графичен FTP клиент
+Comment[br]=Ur gliant skeudenn FTP
+Comment[ca]=Un client gràfic FTP
+Comment[cs]=Grafický FTP klient
+Comment[da]=En grafisk FTP klient
+Comment[de]=Graphischer FTP-Client
+Comment[el]=Ένας γραφικός πελάτης FTP
+Comment[es]=Un cliente gráfico de FTP
+Comment[et]=Graafiline FTP-klient
+Comment[fr]=Un client FTP graphique
+Comment[ga]=Cliant grafach FTP
+Comment[gl]=Un cliente FTP gráfico
+Comment[it]=Un client FTP grafico
+Comment[ja]=グラフィカルな FTP クライアント
+Comment[ka]=გრაფიკული FTP კლიენტი
+Comment[lt]=Grafinis FTP klientas
+Comment[nl]=Een grafische FTP-cliënt
+Comment[pa]=ਇੱਕ ਗਰਾਫਿਕਲ FTP ਕਲਾਂਇਟ
+Comment[pt]=Um cliente gráfico de FTP
+Comment[pt_BR]=Um cliente gráfico para FTP
+Comment[ru]=Графический клиент FTP
+Comment[sr]=Графички FTP лијент
+Comment[sr@Latn]=Grafički FTP lijent
+Comment[sv]=En grafisk FTP-klient
+Comment[tr]=Grafiksel FTP İstemcisi
+Comment[uk]=Клієнт FTP з графічним інтерфейсом
+Comment[xx]=xxA graphical FTP clientxx
+Comment[zh_CN]=图形化 FTP 客户端
+Exec=kftpgrabber
+Icon=kftpgrabber
+Type=Application
+Categories=Qt;KDE;Network;FileTransfer;
diff --git a/kftpgrabber/src/kftpgrabberui.rc b/kftpgrabber/src/kftpgrabberui.rc
new file mode 100644
index 0000000..b67eb2f
--- /dev/null
+++ b/kftpgrabber/src/kftpgrabberui.rc
@@ -0,0 +1,31 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kftpgrabber" version="1">
+
+<MenuBar>
+ <text>Main Menu</text>
+
+ <Menu name="file">
+ <text>&amp;File</text>
+
+ <Action name="file_newsession" />
+ <Action name="file_quick_connect" />
+ </Menu>
+
+ <Action name="bookmarks" />
+
+</MenuBar>
+
+<ToolBar name="mainToolBar" noMerge="1" fullWidth="true"><text>Main Toolbar</text>
+ <Action name="file_newsession" />
+ <Action name="file_quick_connect" />
+ <Action name="transfermode" />
+</ToolBar>
+
+<ToolBar name="bookmarkToolBar" noMerge="1" fullWidth="true"><text>Bookmark Toolbar</text>
+ <Action name="bookmark_new" />
+ <Action name="bookmark_edit2" />
+ <Action name="bookmark_delete" />
+ <Separator/>
+ <Action name="bookmark_subcat" />
+</ToolBar>
+</kpartgui>
diff --git a/kftpgrabber/src/kftpqueue.cpp b/kftpgrabber/src/kftpqueue.cpp
new file mode 100644
index 0000000..0186c4e
--- /dev/null
+++ b/kftpgrabber/src/kftpqueue.cpp
@@ -0,0 +1,834 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <math.h>
+
+#include "kftpqueue.h"
+#include "kftpbookmarks.h"
+#include "widgets/systemtray.h"
+#include "kftpqueueprocessor.h"
+#include "kftpsession.h"
+
+#include "misc/config.h"
+#include "misc/filter.h"
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kio/renamedlg.h>
+#include <kdiskfreesp.h>
+#include <kfileitem.h>
+#include <kopenwith.h>
+#include <kstaticdeleter.h>
+#include <kservice.h>
+#include <kuserprofile.h>
+#include <kstandarddirs.h>
+#include <krun.h>
+#include <kmdcodec.h>
+
+#include <qapplication.h>
+#include <qregexp.h>
+#include <qobjectlist.h>
+#include <qfile.h>
+
+using namespace KFTPEngine;
+using namespace KFTPCore::Filter;
+
+namespace KFTPQueue {
+
+OpenedFile::OpenedFile(TransferFile *transfer)
+ : m_source(transfer->getSourceUrl()),
+ m_dest(transfer->getDestUrl()),
+ m_hash(QString::null)
+{
+ // Calculate the file's MD5 hash
+ QFile file(m_dest.path());
+ if (!file.open(IO_ReadOnly)) {
+ return;
+ }
+
+ KMD5 context;
+ if (context.update(file))
+ m_hash = QString(context.hexDigest());
+ file.close();
+}
+
+bool OpenedFile::hasChanged()
+{
+ // Compare the file's MD5 hash with stored value
+ QFile file(m_dest.path());
+ if (!file.open(IO_ReadOnly)) {
+ return false;
+ }
+
+ QString tmp = QString::null;
+ KMD5 context;
+ if (context.update(file))
+ tmp = QString(context.hexDigest());
+ file.close();
+
+ return tmp != m_hash;
+}
+
+UserDialogRequest::UserDialogRequest(TransferFile *transfer, filesize_t srcSize, time_t srcTime,
+ filesize_t dstSize, time_t dstTime)
+ : m_transfer(transfer),
+ m_srcSize(srcSize),
+ m_srcTime(srcTime),
+ m_dstSize(dstSize),
+ m_dstTime(dstTime)
+{
+}
+
+void UserDialogRequest::sendResponse(FileExistsWakeupEvent *event)
+{
+ m_transfer->wakeup(event);
+ delete this;
+}
+
+Manager *Manager::m_self = 0;
+static KStaticDeleter<Manager> staticManagerDeleter;
+
+Manager *Manager::self()
+{
+ if (!m_self) {
+ staticManagerDeleter.setObject(m_self, new Manager());
+ }
+
+ return m_self;
+}
+
+Manager::Manager()
+ : m_topLevel(new QueueObject(this, QueueObject::Toplevel)),
+ m_processingQueue(false),
+ m_feDialogOpen(false),
+ m_defaultFeAction(FE_DISABLE_ACT)
+{
+ m_topLevel->setId(0);
+
+ m_lastQID = 1;
+ m_curDownSpeed = 0;
+ m_curUpSpeed = 0;
+
+ m_emitUpdate = true;
+
+ // Create the queue processor object
+ m_queueProc = new KFTPQueueProcessor(this);
+
+ connect(m_queueProc, SIGNAL(queueComplete()), this, SLOT(slotQueueProcessingComplete()));
+ connect(m_queueProc, SIGNAL(queueAborted()), this, SLOT(slotQueueProcessingAborted()));
+
+ // Create the queue converter object
+ m_converter = new KFTPQueueConverter(this);
+}
+
+Manager::~Manager()
+{
+ if (m_self == this)
+ staticManagerDeleter.setObject(m_self, 0, false);
+}
+
+void Manager::stopAllTransfers()
+{
+ if (isProcessing()) {
+ abort();
+ } else {
+ QueueObject *i;
+ QPtrList<QueueObject> sites = topLevelObject()->getChildrenList();
+
+ for (i = sites.first(); i; i = sites.next()) {
+ if (i->isRunning()) {
+ i->abort();
+ } else {
+ QueueObject *t;
+ QPtrList<QueueObject> list = i->getChildrenList();
+
+ for (t = list.first(); t; t = list.next()) {
+ if (t->isRunning())
+ t->abort();
+ }
+ }
+ }
+ }
+}
+
+Transfer *Manager::findTransfer(long id)
+{
+ // First try the cache
+ QueueObject *object = m_queueObjectCache[QString::number(id)];
+
+ if (!object) {
+ object = m_topLevel->findChildObject(id);
+ m_queueObjectCache.insert(QString::number(id), object);
+ }
+
+ return static_cast<Transfer*>(object);
+}
+
+Site *Manager::findSite(KURL url, bool noCreate)
+{
+ // Reset path
+ url.setPath("/");
+
+ if (url.isLocalFile())
+ return NULL;
+
+ // Find the appropriate site and if one doesn't exist create a new one
+ QueueObject *i;
+ QPtrList<QueueObject> sites = topLevelObject()->getChildrenList();
+
+ for (i = sites.first(); i; i = sites.next()) {
+ if (i->getType() == QueueObject::Site) {
+ Site *site = static_cast<Site*>(i);
+
+ if (site->getUrl() == url)
+ return site;
+ }
+ }
+
+ // The site doesn't exist, let's create one
+ if (!noCreate) {
+ Site *site = new Site(topLevelObject(), url);
+ site->setId(m_lastQID++);
+ emit newSite(site);
+
+ return site;
+ }
+
+ return 0;
+}
+
+void Manager::insertTransfer(Transfer *transfer)
+{
+ // Set id
+ transfer->setId(m_lastQID++);
+
+ // Reparent transfer
+ filesize_t size = transfer->getSize();
+ transfer->addSize(-size);
+
+ if (transfer->hasParentObject())
+ transfer->parentObject()->delChildObject(transfer);
+
+ if (transfer->parent())
+ transfer->parent()->removeChild(transfer);
+
+ Site *site = 0;
+
+ switch (transfer->getTransferType()) {
+ case Download: site = findSite(transfer->getSourceUrl()); break;
+ case Upload: site = findSite(transfer->getDestUrl()); break;
+ case FXP: site = findSite(transfer->getSourceUrl()); break;
+ }
+
+ site->insertChild(transfer);
+ site->addChildObject(transfer);
+ transfer->addSize(size);
+
+ emit newTransfer(transfer);
+
+ if (m_emitUpdate)
+ emit queueUpdate();
+}
+
+void Manager::insertTransfer(KURLDrag *drag)
+{
+ // Decode the drag
+ KIO::MetaData p_meta;
+ KURL::List p_urls;
+ KURLDrag::decode(drag, p_urls, p_meta);
+
+ // TODO make support for local drops - eg. from konqueror, where
+ // we get no meta data, so we must get the file info ourselves and
+ // reject remote urls (or show a dialog to ask the user if he
+ // wants to connect to the remote site)
+
+ // Now we should add transfers for all URLs
+ Transfer *lastTransfer = 0L;
+ KURL::List::iterator end(p_urls.end());
+
+ for (KURL::List::iterator i(p_urls.begin()); i != end; ++i) {
+ QString p_data = p_meta[(*i).htmlURL().local8Bit()];
+ QChar type = p_data.at(0);
+ filesize_t size = p_data.section(':', 1, 1).toULongLong();
+ KURL sourceUrl = (*i);
+ KURL destinationUrl = KURL(p_meta["DestURL"]);
+ destinationUrl.addPath(sourceUrl.fileName());
+
+ // Skip where both files are local
+ if (sourceUrl.isLocalFile() && destinationUrl.isLocalFile())
+ continue;
+
+ lastTransfer = spawnTransfer(sourceUrl, destinationUrl, size, type == 'D', true, true, 0L, true);
+ }
+
+ // Execute the transfer if set in configuration
+ if (!KFTPCore::Config::queueOnDND() && lastTransfer)
+ static_cast<KFTPQueue::Site*>(lastTransfer->parentObject())->delayedExecute();
+}
+
+Transfer *Manager::spawnTransfer(KURL sourceUrl, KURL destinationUrl, filesize_t size, bool dir, bool ignoreSkip,
+ bool insertToQueue, QObject *parent, bool noScan)
+{
+ const ActionChain *actionChain = Filters::self()->process(sourceUrl, size, dir);
+
+ if (!ignoreSkip && (actionChain && actionChain->getAction(Action::Skip)))
+ return 0;
+
+ // Determine transfer type
+ TransferType type;
+
+ if (sourceUrl.isLocalFile())
+ type = Upload;
+ else if (destinationUrl.isLocalFile())
+ type = Download;
+ else
+ type = FXP;
+
+ // Should we lowercase the destination path ?
+ if (actionChain && actionChain->getAction(Action::Lowercase))
+ destinationUrl.setPath(destinationUrl.directory() + "/" + destinationUrl.fileName().lower());
+
+ // Reset a possible preconfigured default action
+ setDefaultFileExistsAction();
+
+ if (!parent)
+ parent = this;
+
+ Transfer *transfer = 0L;
+
+ if (dir)
+ transfer = new TransferDir(parent);
+ else {
+ transfer = new TransferFile(parent);
+ transfer->addSize(size);
+ }
+
+ transfer->setSourceUrl(sourceUrl);
+ transfer->setDestUrl(destinationUrl);
+ transfer->setTransferType(type);
+
+ if (insertToQueue) {
+ insertTransfer(transfer);
+ } else {
+ transfer->setId(m_lastQID++);
+ emit newTransfer(transfer);
+ }
+
+ if (dir && !noScan) {
+ // This is a directory, we should scan the directory and add all files/dirs found
+ // as parent of current object
+ KFTPSession::Session *session = KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, sourceUrl, 0, true);
+ session->scanDirectory(transfer);
+ }
+
+ return transfer;
+}
+
+void Manager::removeTransfer(Transfer *transfer, bool abortSession)
+{
+ if (!transfer)
+ return;
+
+ transfer->abort();
+ long id = transfer->getId();
+ long sid = transfer->parentObject()->getId();
+
+ // Remove transfer from cache
+ m_queueObjectCache.remove(QString::number(id));
+
+ // Should the site be removed as well ?
+ QueueObject *site = 0;
+ if (transfer->parentObject()->getType() == QueueObject::Site && transfer->parentObject()->getChildrenList().count() == 1)
+ site = transfer->parentObject();
+
+ // Signal destruction & delete transfer
+ transfer->faceDestruction(abortSession);
+ delete transfer;
+
+ if (site) {
+ delete site;
+ emit siteRemoved(sid);
+ }
+
+ emit transferRemoved(id);
+
+ if (m_emitUpdate)
+ emit queueUpdate();
+}
+
+void Manager::revalidateTransfer(Transfer *transfer)
+{
+ QueueObject *i = transfer;
+
+ while (i) {
+ if (i->parentObject() == topLevelObject())
+ break;
+
+ i = i->parentObject();
+ }
+
+ // We have the site
+ Site *curSite = static_cast<Site*>(i);
+ Site *site = 0;
+
+ switch (transfer->getTransferType()) {
+ case Download: site = findSite(transfer->getSourceUrl()); break;
+ case Upload: site = findSite(transfer->getDestUrl()); break;
+ case FXP: site = findSite(transfer->getSourceUrl()); break;
+ }
+
+ // If the sites don't match, reparent transfer
+ if (site != curSite) {
+ transfer->parentObject()->delChildObject(transfer);
+ transfer->parent()->removeChild(transfer);
+
+ site->insertChild(transfer);
+ site->addChildObject(transfer);
+
+ emit transferRemoved(transfer->getId());
+ emit newTransfer(transfer);
+
+ if (curSite->getChildrenList().count() == 0) {
+ emit siteRemoved(curSite->getId());
+ curSite->deleteLater();
+ }
+ }
+}
+
+void Manager::removeFailedTransfer(FailedTransfer *transfer)
+{
+ // Remove the transfer and signal removal
+ m_failedTransfers.remove(transfer);
+ emit failedTransferRemoved(transfer->getTransfer()->getId());
+
+ delete transfer;
+}
+
+void Manager::clearFailedTransferList()
+{
+ // Clear the failed transfers list
+ FailedTransfer *transfer;
+ QPtrListIterator<KFTPQueue::FailedTransfer> i(m_failedTransfers);
+
+ while ((transfer = i.current()) != 0) {
+ ++i;
+ removeFailedTransfer(transfer);
+ }
+}
+
+void Manager::moveTransferUp(QueueObject *object)
+{
+ object->parentObject()->moveChildUp(object);
+
+ if (m_emitUpdate)
+ emit queueUpdate();
+}
+
+void Manager::moveTransferDown(QueueObject *object)
+{
+ object->parentObject()->moveChildDown(object);
+
+ if (m_emitUpdate)
+ emit queueUpdate();
+}
+
+void Manager::moveTransferTop(QueueObject *object)
+{
+ object->parentObject()->moveChildTop(object);
+
+ if (m_emitUpdate)
+ emit queueUpdate();
+}
+
+void Manager::moveTransferBottom(QueueObject *object)
+{
+ object->parentObject()->moveChildBottom(object);
+
+ if (m_emitUpdate)
+ emit queueUpdate();
+}
+
+bool Manager::canBeMovedUp(QueueObject *object)
+{
+ return object ? object->parentObject()->canMoveChildUp(object) : false;
+}
+
+bool Manager::canBeMovedDown(QueueObject *object)
+{
+ return object ? object->parentObject()->canMoveChildDown(object) : false;
+}
+
+void Manager::doEmitUpdate()
+{
+ m_curDownSpeed = 0;
+ m_curUpSpeed = 0;
+
+ topLevelObject()->removeMarkedTransfers();
+
+ // Get download/upload speeds
+ QueueObject *i;
+ QPtrList<QueueObject> sites = topLevelObject()->getChildrenList();
+
+ for (i = sites.first(); i; i = sites.next()) {
+ QueueObject *t;
+ QPtrList<QueueObject> list = i->getChildrenList();
+
+ for (t = list.first(); t; t = list.next()) {
+ KFTPQueue::Transfer *tmp = static_cast<Transfer*>(t);
+
+ switch (tmp->getTransferType()) {
+ case Download: m_curDownSpeed += tmp->getSpeed(); break;
+ case Upload: m_curUpSpeed += tmp->getSpeed(); break;
+ case FXP: {
+ m_curDownSpeed += tmp->getSpeed();
+ m_curUpSpeed += tmp->getSpeed();
+ break;
+ }
+ }
+ }
+ }
+
+ // Emit global update to all GUI objects
+ emit queueUpdate();
+}
+
+void Manager::start()
+{
+ if (m_processingQueue)
+ return;
+
+ m_processingQueue = true;
+
+ // Now, go trough all queued files and execute them - try to do as little server connects
+ // as possible
+ m_queueProc->startProcessing();
+}
+
+void Manager::abort()
+{
+ m_processingQueue = false;
+
+ // Stop further queue processing
+ m_queueProc->stopProcessing();
+
+ emit queueUpdate();
+}
+
+void Manager::slotQueueProcessingComplete()
+{
+ m_processingQueue = false;
+
+ // Queue processing is now complete
+ if (KFTPCore::Config::showBalloons())
+ KFTPWidgets::SystemTray::self()->showBalloon(i18n("All queued transfers have been completed."));
+
+ emit queueUpdate();
+}
+
+void Manager::slotQueueProcessingAborted()
+{
+ m_processingQueue = false;
+}
+
+void Manager::clearQueue()
+{
+ QueueObject *i;
+ QPtrList<QueueObject> sites = topLevelObject()->getChildrenList();
+
+ for (i = sites.first(); i; i = sites.next()) {
+ QueueObject *t;
+ QPtrList<QueueObject> list = i->getChildrenList();
+
+ for (t = list.first(); t; t = list.next())
+ removeTransfer(static_cast<Transfer*>(t));
+ }
+}
+
+int Manager::getTransferPercentage()
+{
+ return 0;
+}
+
+int Manager::getNumRunning(bool onlyDirs)
+{
+ int running = 0;
+
+ QueueObject *i;
+ QPtrList<QueueObject> sites = topLevelObject()->getChildrenList();
+
+ for (i = sites.first(); i; i = sites.next()) {
+ QueueObject *t;
+ QPtrList<QueueObject> list = i->getChildrenList();
+
+ for (t = list.first(); t; t = list.next()) {
+ if (t->isRunning() && (!onlyDirs || t->isDir()))
+ running++;
+ }
+
+ if (i->isRunning())
+ running++;
+ }
+
+ return running;
+}
+
+int Manager::getNumRunning(const KURL &remoteUrl)
+{
+ int running = 0;
+ Site *site = findSite(remoteUrl, true);
+
+ if (site) {
+ QueueObject *i;
+ QPtrList<QueueObject> transfers = site->getChildrenList();
+
+ for (i = transfers.first(); i; i = transfers.next()) {
+ if (i->isRunning())
+ running++;
+ }
+ }
+
+ return running;
+}
+
+KFTPEngine::FileExistsWakeupEvent *Manager::fileExistsAction(TransferFile *transfer,
+ QValueList<KFTPEngine::DirectoryEntry> stat)
+{
+ FileExistsWakeupEvent *event = new FileExistsWakeupEvent();
+ FileExistsActions *fa = NULL;
+ FEAction action;
+
+ filesize_t srcSize = 0;
+ time_t srcTime = 0;
+
+ filesize_t dstSize = 0;
+ time_t dstTime = 0;
+
+ // Check if there is a default action set
+ action = getDefaultFileExistsAction();
+
+ if (action == FE_DISABLE_ACT) {
+ switch (transfer->getTransferType()) {
+ case KFTPQueue::Download: {
+ KFileItem info(KFileItem::Unknown, KFileItem::Unknown, transfer->getDestUrl());
+ dstSize = info.size();
+ dstTime = info.time(KIO::UDS_MODIFICATION_TIME);
+
+ srcSize = stat[0].size();
+ srcTime = stat[0].time();
+
+ fa = KFTPCore::Config::self()->dActions();
+ break;
+ }
+ case KFTPQueue::Upload: {
+ KFileItem info(KFileItem::Unknown, KFileItem::Unknown, transfer->getSourceUrl());
+ srcSize = info.size();
+ srcTime = info.time(KIO::UDS_MODIFICATION_TIME);
+
+ dstSize = stat[0].size();
+ dstTime = stat[0].time();
+
+ fa = KFTPCore::Config::self()->uActions();
+ break;
+ }
+ case KFTPQueue::FXP: {
+ srcSize = stat[0].size();
+ srcTime = stat[0].time();
+
+ dstSize = stat[1].size();
+ dstTime = stat[1].time();
+
+ fa = KFTPCore::Config::self()->fActions();
+ break;
+ }
+ }
+
+ // Now that we have all data, get the action and do it
+ action = fa->getActionForSituation(srcSize, srcTime, dstSize, dstTime);
+ }
+
+ switch (action) {
+ default:
+ case FE_SKIP_ACT: event->action = FileExistsWakeupEvent::Skip; break;
+ case FE_OVERWRITE_ACT: event->action = FileExistsWakeupEvent::Overwrite; break;
+ case FE_RESUME_ACT: event->action = FileExistsWakeupEvent::Resume; break;
+ case FE_RENAME_ACT:
+ case FE_USER_ACT: {
+ appendUserDialogRequest(new UserDialogRequest(transfer, srcSize, srcTime, dstSize, dstTime));
+
+ // Event shall be deferred
+ delete event;
+ event = 0;
+ }
+ }
+
+ return event;
+}
+
+void Manager::appendUserDialogRequest(UserDialogRequest *request)
+{
+ m_userDialogRequests.append(request);
+
+ if (m_userDialogRequests.count() == 1) {
+ processUserDialogRequest();
+ }
+}
+
+void Manager::processUserDialogRequest()
+{
+ UserDialogRequest *request = m_userDialogRequests.getFirst();
+ if (!request)
+ return;
+
+ FEAction action = getDefaultFileExistsAction();
+ FileExistsWakeupEvent *event = new FileExistsWakeupEvent();
+
+ if (action == FE_DISABLE_ACT || action == FE_USER_ACT) {
+ // A dialog really needs to be displayed
+ TransferFile *transfer = request->getTransfer();
+
+ QString newDestPath;
+ KIO::RenameDlg_Result r = KIO::open_RenameDlg(
+ i18n("File Exists"),
+ transfer->getSourceUrl().prettyURL(),
+ transfer->getDestUrl().prettyURL(),
+ (KIO::RenameDlg_Mode) (KIO::M_OVERWRITE | KIO::M_RESUME | KIO::M_SKIP | KIO::M_MULTI),
+ newDestPath,
+ request->sourceSize(),
+ request->destinationSize(),
+ request->sourceTime(),
+ request->destinationTime()
+ );
+
+ switch (r) {
+ case KIO::R_RENAME: {
+ KURL url = transfer->getDestUrl();
+ url.setPath(newDestPath);
+ transfer->setDestUrl(url);
+
+ event->action = FileExistsWakeupEvent::Rename;
+ event->newFileName = newDestPath;
+ break;
+ }
+ case KIO::R_CANCEL: {
+ // Abort queue processing
+ abort();
+ transfer->abort();
+
+ // An event is not required, since we will not be recalling the process
+ delete event;
+ event = 0;
+ break;
+ }
+ case KIO::R_AUTO_SKIP: setDefaultFileExistsAction(FE_SKIP_ACT);
+ case KIO::R_SKIP: event->action = FileExistsWakeupEvent::Skip; break;
+ case KIO::R_RESUME_ALL: setDefaultFileExistsAction(FE_RESUME_ACT);
+ case KIO::R_RESUME: event->action = FileExistsWakeupEvent::Resume; break;
+ case KIO::R_OVERWRITE_ALL: setDefaultFileExistsAction(FE_OVERWRITE_ACT);
+ default: event->action = FileExistsWakeupEvent::Overwrite; break;
+ }
+ } else {
+ switch (action) {
+ default:
+ case FE_SKIP_ACT: event->action = FileExistsWakeupEvent::Skip; break;
+ case FE_OVERWRITE_ACT: event->action = FileExistsWakeupEvent::Overwrite; break;
+ case FE_RESUME_ACT: event->action = FileExistsWakeupEvent::Resume; break;
+ }
+ }
+
+ // Send a response to this request
+ request->sendResponse(event);
+
+ m_userDialogRequests.removeFirst();
+
+ if (!m_userDialogRequests.isEmpty())
+ processUserDialogRequest();
+}
+
+void Manager::openAfterTransfer(TransferFile *transfer)
+{
+ QString mimeType = KMimeType::findByURL(transfer->getDestUrl(), 0, true, true)->name();
+ KService::Ptr offer = KServiceTypeProfile::preferredService(mimeType, "Application");
+
+ if (!offer) {
+ KOpenWithDlg dialog(KURL::List(transfer->getDestUrl()));
+
+ if (dialog.exec() == QDialog::Accepted) {
+ offer = dialog.service();
+
+ if (!offer)
+ offer = new KService("", dialog.text(), "");
+ } else {
+ return;
+ }
+ }
+
+ QStringList params = KRun::processDesktopExec(*offer, KURL::List(transfer->getDestUrl()), false);
+ KProcess *p = new KProcess(this);
+ *p << params;
+
+ connect(p, SIGNAL(processExited(KProcess*)), this, SLOT(slotEditProcessTerminated(KProcess*)));
+
+ p->start();
+
+ // Save the process
+ m_editProcessList.insert(p->pid(), OpenedFile(transfer));
+}
+
+void Manager::slotEditProcessTerminated(KProcess *p)
+{
+ // A process has terminated, we should reupload
+ OpenedFile file = m_editProcessList[p->pid()];
+
+ // Only upload a file if it has been changed
+ if (file.hasChanged()) {
+ TransferFile *transfer = new TransferFile(KFTPQueue::Manager::self());
+ transfer->setSourceUrl(file.destination());
+ transfer->setDestUrl(file.source());
+ transfer->setTransferType(KFTPQueue::Upload);
+ transfer->addSize(KFileItem(KFileItem::Unknown, KFileItem::Unknown, file.destination()).size());
+ insertTransfer(transfer);
+
+ // Execute the transfer
+ transfer->delayedExecute();
+ }
+
+ // Cleanup
+ m_editProcessList.remove(p->pid());
+ p->deleteLater();
+}
+
+}
+
+#include "kftpqueue.moc"
diff --git a/kftpgrabber/src/kftpqueue.h b/kftpgrabber/src/kftpqueue.h
new file mode 100644
index 0000000..d20d817
--- /dev/null
+++ b/kftpgrabber/src/kftpqueue.h
@@ -0,0 +1,531 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUE_H
+#define KFTPQUEUE_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+#include <qtimer.h>
+#include <qcache.h>
+#include <qmap.h>
+#include <qpair.h>
+
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kprocess.h>
+
+#include "kftpqueueprocessor.h"
+#include "kftpqueueconverter.h"
+#include "kftpfileexistsactions.h"
+#include "misc.h"
+
+#include "engine/directorylisting.h"
+#include "engine/event.h"
+
+#include "directoryscanner.h"
+#include "kftptransfer.h"
+#include "kftptransferfile.h"
+#include "kftptransferdir.h"
+#include "site.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPSession {
+ class Session;
+ class Connection;
+}
+
+class KFTPQueueConverter;
+
+typedef QPtrList<KFTPQueue::Transfer> KFTPQueueTransfers;
+
+namespace KFTPQueue {
+
+class FailedTransfer;
+
+/**
+ * This class represents an opened remote file. The file is stored locally
+ * while its being displayed to the user.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class OpenedFile {
+public:
+ OpenedFile() {}
+
+ /**
+ * Creates a new OpenedFile object.
+ *
+ * @param transfer The transfer used to transfer the file
+ */
+ OpenedFile(TransferFile *transfer);
+
+ /**
+ * Get file's source (remote).
+ *
+ * @return File's remote source URL
+ */
+ KURL source() { return m_source; }
+
+ /**
+ * Get file's destination (local).
+ *
+ * @return File's local destination URL
+ */
+ KURL destination() { return m_dest; }
+
+ /**
+ * Has the file changed since the transfer ?
+ *
+ * @return True if the file has been changed since being transfered
+ */
+ bool hasChanged();
+private:
+ KURL m_source;
+ KURL m_dest;
+
+ QString m_hash;
+};
+
+/**
+ * This class represents a request for "file already exists" dialog
+ * display request.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class UserDialogRequest {
+public:
+ /**
+ * Class constructor.
+ */
+ UserDialogRequest(TransferFile *transfer, filesize_t srcSize, time_t srcTime,
+ filesize_t dstSize, time_t dstTime);
+
+ /**
+ * Sends a response to this request.
+ *
+ * @param event A valid file exists wakeup event
+ */
+ void sendResponse(KFTPEngine::FileExistsWakeupEvent *event);
+
+ /**
+ * Returns the transfer that initiated the request.
+ */
+ TransferFile *getTransfer() const { return m_transfer; }
+
+ /**
+ * Returns source file size.
+ */
+ filesize_t sourceSize() const { return m_srcSize; }
+
+ /**
+ * Returns source file time.
+ */
+ time_t sourceTime() const { return m_srcTime; }
+
+ /**
+ * Returns destination file size.
+ */
+ filesize_t destinationSize() const { return m_dstSize; }
+
+ /**
+ * Returns destination file time.
+ */
+ time_t destinationTime() const { return m_dstTime; }
+private:
+ TransferFile *m_transfer;
+ filesize_t m_srcSize;
+ time_t m_srcTime;
+ filesize_t m_dstSize;
+ time_t m_dstTime;
+};
+
+/**
+ * This class is responsible for managing the complete queue hierarchy. All
+ * queued items descend from QueueObject and are contained in a simple tree
+ * model. Statistics and abort requests propagate from bottom to top and exec
+ * requests go in the other direction.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class Manager : public QObject {
+Q_OBJECT
+friend class KFTPSession::Session;
+friend class KFTPSession::Connection;
+friend class ::KFTPQueueConverter;
+friend class DirectoryScanner::ScannerThread;
+friend class KFTPQueue::FailedTransfer;
+public:
+ /**
+ * Returns the global manager instance.
+ */
+ static Manager *self();
+
+ /**
+ * Class destructor.
+ */
+ ~Manager();
+
+ /**
+ * Stop all queued transfers.
+ */
+ void stopAllTransfers();
+
+ /**
+ * Get the toplevel queue object. The direct children of this object are different
+ * KFTPQueue::Site objects that represent separate sites.
+ *
+ * @return A QueueObject representing the toplevel object
+ */
+ QueueObject *topLevelObject() const { return m_topLevel; }
+
+ /**
+ * Queues a new transfer by looking at the URL drag data.
+ *
+ * @param drag The drag data
+ */
+ void insertTransfer(KURLDrag *drag);
+
+ /**
+ * Queues a new transfer. This method will create the site if one doesn't exist yet
+ * for this transfer. The object will be reparented under the assigned site.
+ *
+ * @param transfer The transfer to be queued
+ */
+ void insertTransfer(Transfer *transfer);
+
+ /**
+ * Remove a transfer from the queue. The faceDestruction method will be called on the
+ * transfer object before removal. After calling this method, you shouldn't use the
+ * object anymore!
+ *
+ * @param transfer The transfer to be removed from queue
+ * @param abortSession If true any session that this transfer is using is aborted
+ */
+ void removeTransfer(Transfer *transfer, bool abortSession = true);
+
+ /**
+ * This method removes all the transfers from the queue.
+ */
+ void clearQueue();
+
+ /**
+ * Check if the transfer is under the correct site and move it if not.
+ *
+ * @param transfer The transfer to check
+ */
+ void revalidateTransfer(Transfer *transfer);
+
+ /**
+ * Finds a transfer by its id.
+ *
+ * @param id The transfer's id
+ * @return The transfer object
+ */
+ Transfer *findTransfer(long id);
+
+ /**
+ * Finds a site by its URL.
+ *
+ * @param url The site's URL
+ * @param noCreate If set to true the site will not be created when not found
+ * and NULL will be returned
+ * @return The site object
+ */
+ Site *findSite(KURL url, bool noCreate = false);
+
+ /**
+ * Remove a failed transfer from the list.
+ *
+ * @param transfer The failed transfer object to be removed
+ */
+ void removeFailedTransfer(FailedTransfer *transfer);
+
+ /**
+ * Remove all failed transfers from the list. This method actually calls the
+ * removeFailedTransfer for every failed transfer present.
+ */
+ void clearFailedTransferList();
+
+ /**
+ * Moves the specified transfer up in the queue.
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferUp(QueueObject *object);
+
+ /**
+ * Moves the specified transfer down in the queue.
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferDown(QueueObject *object);
+
+ /**
+ * Moves the specified transfer to the top of the queue (only within the
+ * parent boundaries).
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferTop(QueueObject *object);
+
+ /**
+ * Moves the specified transfer to the bottom of the queue (only within the
+ * parent boundaries).
+ *
+ * @param object The queue object to be moved
+ */
+ void moveTransferBottom(QueueObject *object);
+
+ /**
+ * Can the transfer be moved up ?
+ *
+ * @param object The queue object to be moved
+ * @return True if the transfer can be moved
+ */
+ bool canBeMovedUp(QueueObject *object);
+
+ /**
+ * Can the transfer be moved down ?
+ *
+ * @param object The queue object to be moved
+ * @return True if the transfer can be moved
+ */
+ bool canBeMovedDown(QueueObject *object);
+
+ /**
+ * Returns the list of failed transfers.
+ *
+ * @return The QPtrList of FailedTransfer objects
+ */
+ QPtrList<KFTPQueue::FailedTransfer> *getFailedTransferList() { return &m_failedTransfers; }
+
+ /**
+ * Return the queue converter (exporter).
+ *
+ * @return the KFTPQueueConverter object
+ */
+ KFTPQueueConverter *getConverter() const { return m_converter; }
+
+ /**
+ * Opens the file with the registred application for it's MIME type and waits
+ * for the process to exit (then it will reupload the file if it has changed).
+ *
+ * @param transfer The transfer whose destination should be opened
+ */
+ void openAfterTransfer(TransferFile *transfer);
+
+ /**
+ * Should the update() be emitted on changes ?
+ *
+ * @param value True if the value should be emitted, false otherwise
+ */
+ void setEmitUpdate(bool value) { m_emitUpdate = value; }
+
+ /**
+ * Does a global queue update and removes all transfers that have the "delete me"
+ * variable set.
+ */
+ void doEmitUpdate();
+
+ /**
+ * Get the current download speed.
+ *
+ * @return The current download speed
+ */
+ filesize_t getDownloadSpeed() const { return m_curDownSpeed; }
+
+ /**
+ * Get the current upload speed.
+ *
+ * @return The current upload speed
+ */
+ filesize_t getUploadSpeed() const { return m_curUpSpeed; }
+
+ /**
+ * Get the percentage of the queue's completion.
+ *
+ * @return The percentage of the queue's completion
+ */
+ int getTransferPercentage();
+
+ /**
+ * Get the number of currently running transfers.
+ *
+ * @param onlyDirs Should only directories be counted
+ * @return The number of currently running transfers
+ */
+ int getNumRunning(bool onlyDirs = false);
+
+ /**
+ * Get the number of currently running transfers under a specific
+ * site.
+ *
+ * @param url The remote URL
+ * @return The number of currently running transfers
+ */
+ int getNumRunning(const KURL &remoteUrl);
+
+ /**
+ * Start the queue processing.
+ */
+ void start();
+
+ /**
+ * Abort the queue processing.
+ */
+ void abort();
+
+ /**
+ * Is the queue being processed ?
+ *
+ * @return True if the queue is being processed, false otherwise
+ */
+ bool isProcessing() { return m_queueProc->isRunning(); }
+
+ /**
+ * Return the next available transfer id and reserve it.
+ *
+ * @return The next available transfer id
+ */
+ long nextTransferId() { return m_lastQID++; }
+
+ /**
+ * Set a default action to take when encountering an existing file situation. Note that
+ * the action set here will override any preconfigured user actions unless set to the
+ * value of FE_DISABLE_ACT.
+ *
+ * @param action The action to take
+ */
+ void setDefaultFileExistsAction(FEAction action = FE_DISABLE_ACT) { m_defaultFeAction = action; }
+
+ /**
+ * Get the default action preset for situations where a file already exists.
+ *
+ * @return A valid FEAction
+ */
+ FEAction getDefaultFileExistsAction() const { return m_defaultFeAction; }
+
+ /**
+ * Decides what to do with the existing file. It will return a valid wakeup event to
+ * dispatch. It will first consider the pre-configured "on file exists" action matrix.
+ *
+ * @param transfer The transfer object
+ * @param srcStat Source file information (if remote)
+ * @param dstStat Destination file information (if remote)
+ * @return A FileExistsWakeupEvent that will be sent to the engine
+ */
+ KFTPEngine::FileExistsWakeupEvent *fileExistsAction(KFTPQueue::TransferFile *transfer,
+ QValueList<KFTPEngine::DirectoryEntry> stat);
+
+ /**
+ * Spawn a new transfer.
+ *
+ * @param sourceUrl Source URL
+ * @param destinationUrl Destination URL
+ * @param size Filesize
+ * @param dir True if this transfer represents a directory
+ * @param ignoreSkip Ignore skiplist for this transfer
+ * @param insertToQueue Should the new transfer be queued
+ * @param parent Optional parent object
+ * @param noScan True if directory transfers shouldn't be scanned
+ * @return A valid KFTPQueue::Transfer instance
+ */
+ KFTPQueue::Transfer *spawnTransfer(KURL sourceUrl, KURL destinationUrl, filesize_t size, bool dir,
+ bool ignoreSkip = false, bool insertToQueue = true, QObject *parent = 0L, bool noScan = false);
+protected:
+ /**
+ * Global class instance.
+ */
+ static Manager *m_self;
+
+ /**
+ * Class constructor.
+ */
+ Manager();
+
+ /**
+ * Appends a new user dialog request.
+ *
+ * @param request Request instance
+ */
+ void appendUserDialogRequest(UserDialogRequest *request);
+
+ /**
+ * Processes the top user dialog request by opening the desired "file
+ * already exists" dialog.
+ */
+ void processUserDialogRequest();
+private:
+ QueueObject *m_topLevel;
+ QCache<QueueObject> m_queueObjectCache;
+
+ QMap<pid_t, OpenedFile> m_editProcessList;
+ QPtrList<KFTPQueue::FailedTransfer> m_failedTransfers;
+ KFTPQueueProcessor *m_queueProc;
+ KFTPQueueConverter *m_converter;
+
+ long m_lastQID;
+ bool m_emitUpdate;
+ bool m_processingQueue;
+
+ filesize_t m_curDownSpeed;
+ filesize_t m_curUpSpeed;
+
+ bool m_feDialogOpen;
+ FEAction m_defaultFeAction;
+ QPtrList<UserDialogRequest> m_userDialogRequests;
+private slots:
+ void slotQueueProcessingComplete();
+ void slotQueueProcessingAborted();
+
+ void slotEditProcessTerminated(KProcess *p);
+signals:
+ void newSite(KFTPQueue::Site*);
+ void newTransfer(KFTPQueue::Transfer*);
+
+ void transferRemoved(long);
+ void siteRemoved(long);
+
+ void queueUpdate();
+
+ void failedTransferNew(KFTPQueue::FailedTransfer*);
+ void failedTransferRemoved(long);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/kftpqueueconverter.cpp b/kftpgrabber/src/kftpqueueconverter.cpp
new file mode 100644
index 0000000..700ad2f
--- /dev/null
+++ b/kftpgrabber/src/kftpqueueconverter.cpp
@@ -0,0 +1,211 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpqueueconverter.h"
+#include "kftpqueue.h"
+
+#include <qfile.h>
+#include <qobjectlist.h>
+
+#include <kfilterdev.h>
+
+KFTPQueueConverter::KFTPQueueConverter(QObject *parent, const char *name)
+ : QObject(parent, name)
+{
+}
+
+void KFTPQueueConverter::importQueue(const QString &filename)
+{
+ m_xml = QDomDocument("KFTPGrabberQueue");
+ KFTPQueue::Manager::self()->clearQueue();
+
+ // Load from file
+ QIODevice *file = KFilterDev::deviceForFile(filename);
+ m_xml.setContent(file);
+ file->close();
+ delete file;
+
+ // Parse XML and create KFTPQueueTransfers
+ QDomNode n = m_xml.documentElement().firstChild();
+ while (!n.isNull()) {
+ importNode(n);
+
+ n = n.nextSibling();
+ }
+
+ KFTPQueue::Manager::self()->doEmitUpdate();
+}
+
+void KFTPQueueConverter::exportQueue(const QString &filename)
+{
+ m_xml = QDomDocument("KFTPGrabberQueue");
+ m_xml.setContent(QString("<queue></queue>"));
+
+ // Go trough all KFTPQueueTransfers and generate XML
+ KFTPQueue::QueueObject *i;
+ QPtrList<KFTPQueue::QueueObject> sites = KFTPQueue::Manager::self()->topLevelObject()->getChildrenList();
+
+ for (i = sites.first(); i; i = sites.next()) {
+ KFTPQueue::QueueObject *t;
+ QPtrList<KFTPQueue::QueueObject> list = i->getChildrenList();
+
+ for (t = list.first(); t; t = list.next())
+ generateXML(static_cast<KFTPQueue::Transfer*>(t), m_xml.documentElement());
+ }
+
+ // Save to file
+ QIODevice *file = KFilterDev::deviceForFile(filename, "application/x-gzip");
+ if (!file->open(IO_WriteOnly)) {
+ qDebug("WARNING: Unable to open xml for writing!");
+ return;
+ }
+
+ QTextStream fileStream(file);
+ m_xml.save(fileStream, 2);
+ file->flush();
+ file->close();
+ delete file;
+}
+
+void KFTPQueueConverter::generateXML(KFTPQueue::Transfer *transfer, QDomNode parent)
+{
+ // Create the item
+ QDomElement item = m_xml.createElement("item");
+ parent.appendChild(item);
+
+ // Create text nodes
+ createTextNode("source", transfer->getSourceUrl().url(), item);
+ createTextNode("dest", transfer->getDestUrl().url(), item);
+ createTextNode("size", QString::number(transfer->getSize()), item);
+ createTextNode("type", transfer->isDir() ? "directory" : "file", item);
+
+ if (transfer->isDir() && transfer->children()) {
+ // Transfer has children, add them as well
+ QDomElement tag = m_xml.createElement("children");
+ item.appendChild(tag);
+
+ KFTPQueue::QueueObject *i;
+ QPtrList<KFTPQueue::QueueObject> list = transfer->getChildrenList();
+ for (i = list.first(); i; i = list.next()) {
+ generateXML(static_cast<KFTPQueue::Transfer*>(i), tag);
+ }
+ }
+}
+
+void KFTPQueueConverter::importNode(QDomNode node, QObject *parent)
+{
+ // Get node data
+ KURL srcUrl = KURL(getTextNode("source", node));
+ KURL dstUrl = KURL(getTextNode("dest", node));
+ filesize_t size = getTextNode("size", node).toULongLong();
+ bool dir = getTextNode("type", node) == "directory";
+
+ KFTPQueue::TransferType transType = KFTPQueue::Download;
+
+ if (srcUrl.isLocalFile() && !dstUrl.isLocalFile()) {
+ transType = KFTPQueue::Upload;
+ } else if (!srcUrl.isLocalFile() && dstUrl.isLocalFile()) {
+ transType = KFTPQueue::Download;
+ } else if (!srcUrl.isLocalFile() && !dstUrl.isLocalFile()) {
+ transType = KFTPQueue::FXP;
+ }
+
+ // Create new transfer
+ if (!parent)
+ parent = KFTPQueue::Manager::self()->topLevelObject();
+
+ KFTPQueue::Transfer *transfer = 0L;
+ if (dir)
+ transfer = new KFTPQueue::TransferDir(parent);
+ else
+ transfer = new KFTPQueue::TransferFile(parent);
+
+ transfer->setSourceUrl(srcUrl);
+ transfer->setDestUrl(dstUrl);
+ transfer->addSize(dir ? 0 : size);
+ transfer->setTransferType(transType);
+
+ if (parent == KFTPQueue::Manager::self()->topLevelObject()) {
+ KFTPQueue::Manager::self()->insertTransfer(transfer);
+ } else {
+ transfer->setId(KFTPQueue::Manager::self()->m_lastQID++);
+ emit KFTPQueue::Manager::self()->newTransfer(transfer);
+ }
+
+ QDomNodeList tagNodes = node.toElement().elementsByTagName("children");
+ if (dir && tagNodes.length() > 0) {
+ // Import all child nodes
+ QDomNode n = node.firstChild();
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "children") {
+ n = n.firstChild();
+ break;
+ }
+
+ n = n.nextSibling();
+ }
+
+ while (!n.isNull()) {
+ importNode(n, transfer);
+
+ n = n.nextSibling();
+ }
+ }
+}
+
+void KFTPQueueConverter::createTextNode(const QString &name, const QString &value, QDomNode parent)
+{
+ QDomElement tag = m_xml.createElement(name);
+ parent.appendChild(tag);
+
+ QDomText textNode = m_xml.createTextNode(value);
+ tag.appendChild(textNode);
+}
+
+QString KFTPQueueConverter::getTextNode(const QString &name, QDomNode parent)
+{
+ QDomNodeList tagNodes = parent.toElement().elementsByTagName(name);
+
+ if (tagNodes.length() > 0) {
+ QString prop = tagNodes.item(0).toElement().text();
+ prop.stripWhiteSpace();
+
+ return prop;
+ } else {
+ return QString::null;
+ }
+}
+
+#include "kftpqueueconverter.moc"
diff --git a/kftpgrabber/src/kftpqueueconverter.h b/kftpgrabber/src/kftpqueueconverter.h
new file mode 100644
index 0000000..345439f
--- /dev/null
+++ b/kftpgrabber/src/kftpqueueconverter.h
@@ -0,0 +1,82 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUECONVERTER_H
+#define KFTPQUEUECONVERTER_H
+
+#include <qobject.h>
+#include <qdom.h>
+
+namespace KFTPQueue {
+ class Transfer;
+}
+
+/**
+This class provides queue export/import to XML files.
+
+@author Jernej Kos
+*/
+class KFTPQueueConverter : public QObject
+{
+Q_OBJECT
+public:
+ KFTPQueueConverter(QObject *parent = 0, const char *name = 0);
+
+ /**
+ * Import queue from XML file. When called, this function will create
+ * new KFTPQueueTransfers.
+ *
+ * @param filename XML file that contains the queue
+ */
+ void importQueue(const QString &filename);
+
+ /**
+ * Export queue to XML file. It will take all current KFTPQueueTransfers
+ * and convert their properties to XML format.
+ *
+ * @param filename File where queue will be exported
+ */
+ void exportQueue(const QString &filename);
+private:
+ QDomDocument m_xml;
+
+ void generateXML(KFTPQueue::Transfer *transfer, QDomNode parent);
+ void createTextNode(const QString &name, const QString &value, QDomNode parent);
+
+ void importNode(QDomNode node, QObject *parent = 0);
+ QString getTextNode(const QString &name, QDomNode parent);
+};
+
+#endif
diff --git a/kftpgrabber/src/kftpqueueprocessor.cpp b/kftpgrabber/src/kftpqueueprocessor.cpp
new file mode 100644
index 0000000..f6051a2
--- /dev/null
+++ b/kftpgrabber/src/kftpqueueprocessor.cpp
@@ -0,0 +1,137 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpqueueprocessor.h"
+#include "kftpqueue.h"
+#include "kftpsession.h"
+#include "misc.h"
+
+using namespace KFTPGrabberBase;
+
+KFTPQueueProcessor::KFTPQueueProcessor(QObject *parent)
+ : QObject(parent)
+{
+ m_running = false;
+}
+
+bool KFTPQueueProcessor::isRunning()
+{
+ return m_running;
+}
+
+void KFTPQueueProcessor::processActiveSite()
+{
+ if (!m_activeSite)
+ return;
+
+ // Start the transfer
+ m_activeSite->delayedExecute();
+}
+
+bool KFTPQueueProcessor::nextSite()
+{
+ // Select the first server (should be next) if there is none, we are done :)
+ //KFTPQueueTransfers *transfers = FTPQueueManager->getQueueTransferList();
+ QPtrList<KFTPQueue::QueueObject> sites = KFTPQueue::Manager::self()->topLevelObject()->getChildrenList();
+
+ if (sites.count() > 0 && m_running) {
+ if (m_activeSite && m_activeSite->getId() == sites.at(0)->getId()) {
+ // Because this function can be called from slotSiteComplete and signal gets
+ // emitted *before* site is removed we should use the second site on the list
+ m_activeSite = static_cast<KFTPQueue::Site*>(sites.at(1));
+ } else {
+ m_activeSite = static_cast<KFTPQueue::Site*>(sites.at(0));
+ }
+ } else {
+ m_activeSite = 0L;
+ }
+
+ if (m_activeSite) {
+ // Connect the signals
+ connect(m_activeSite, SIGNAL(destroyed(QObject*)), this, SLOT(slotSiteComplete()));
+ connect(m_activeSite, SIGNAL(siteAborted()), this, SLOT(slotSiteAborted()));
+
+ return true;
+ } else {
+ // We are done, so we emit the proper signal
+ m_running = false;
+
+ emit queueComplete();
+ return false;
+ }
+
+ return false;
+}
+
+void KFTPQueueProcessor::startProcessing()
+{
+ m_running = true;
+
+ // Select the site and process it
+ if (nextSite())
+ processActiveSite();
+}
+
+void KFTPQueueProcessor::stopProcessing()
+{
+ // Stop the queue processing
+ m_running = false;
+
+ // Abort current transfer
+ if (m_activeSite) {
+ // Disconnect signals
+ m_activeSite->QObject::disconnect(this);
+ m_activeSite->abort();
+ }
+
+ m_activeSite = 0L;
+ emit queueAborted();
+}
+
+void KFTPQueueProcessor::slotSiteComplete()
+{
+ // Transfer is complete, move to the next
+ if (nextSite())
+ processActiveSite();
+}
+
+void KFTPQueueProcessor::slotSiteAborted()
+{
+ // Transfer has aborted, we should stop
+ stopProcessing();
+}
+
+#include "kftpqueueprocessor.moc"
+
diff --git a/kftpgrabber/src/kftpqueueprocessor.h b/kftpgrabber/src/kftpqueueprocessor.h
new file mode 100644
index 0000000..90de1fd
--- /dev/null
+++ b/kftpgrabber/src/kftpqueueprocessor.h
@@ -0,0 +1,76 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEPROCESSOR_H
+#define KFTPQUEUEPROCESSOR_H
+
+#include <qobject.h>
+#include <qthread.h>
+#include <qapplication.h>
+#include <qguardedptr.h>
+
+namespace KFTPQueue {
+ class Site;
+}
+
+/**
+@author Jernej Kos
+*/
+class KFTPQueueProcessor : public QObject
+{
+friend class KFTPQueueManager;
+Q_OBJECT
+public:
+ KFTPQueueProcessor(QObject *parent);
+
+ void startProcessing();
+ void stopProcessing();
+
+ bool isRunning();
+private:
+ QGuardedPtr<KFTPQueue::Site> m_activeSite;
+ bool m_running;
+
+ void processActiveSite();
+ bool nextSite();
+private slots:
+ void slotSiteComplete();
+ void slotSiteAborted();
+signals:
+ void queueComplete();
+ void queueAborted();
+};
+
+#endif
diff --git a/kftpgrabber/src/kftpsession.cpp b/kftpgrabber/src/kftpsession.cpp
new file mode 100644
index 0000000..126eb3e
--- /dev/null
+++ b/kftpgrabber/src/kftpsession.cpp
@@ -0,0 +1,920 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpsession.h"
+#include "kftpapi.h"
+#include "browser/detailsview.h"
+#include "browser/treeview.h"
+#include "browser/view.h"
+#include "kftpbookmarks.h"
+#include "misc.h"
+#include "widgets/systemtray.h"
+#include "mainactions.h"
+
+#include "misc/config.h"
+#include "misc/filter.h"
+
+#include <qdir.h>
+#include <qobjectlist.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kpassdlg.h>
+#include <kstaticdeleter.h>
+
+using namespace KFTPGrabberBase;
+using namespace KFTPEngine;
+using namespace KFTPCore::Filter;
+
+namespace KFTPSession {
+
+//////////////////////////////////////////////////////////////////
+//////////////////////// Connection ///////////////////////
+//////////////////////////////////////////////////////////////////
+
+Connection::Connection(Session *session, bool primary)
+ : QObject(session),
+ m_primary(primary),
+ m_busy(false),
+ m_aborting(false),
+ m_scanning(false)
+{
+ // Create the actual connection client
+ m_client = new KFTPEngine::Thread();
+
+ connect(m_client->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+
+ // If this is not a core session connection, connect
+ if (!primary) {
+ // Connect to the server
+ KURL url = session->getClient()->socket()->getCurrentUrl();
+
+ KFTPBookmarks::Manager::self()->setupClient(session->getSite(), m_client);
+ m_client->connect(url);
+ }
+}
+
+Connection::~Connection()
+{
+ delete m_client;
+}
+
+bool Connection::isConnected()
+{
+ return !static_cast<Session*>(parent())->isRemote() || m_client->socket()->isConnected();
+}
+
+void Connection::acquire(KFTPQueue::Transfer *transfer)
+{
+ if (m_busy || !static_cast<Session*>(parent())->isRemote())
+ return;
+
+ m_curTransfer = transfer;
+ m_busy = true;
+
+ connect(transfer, SIGNAL(transferComplete(long)), this, SLOT(slotTransferCompleted()));
+ connect(transfer, SIGNAL(transferAbort(long)), this, SLOT(slotTransferCompleted()));
+
+ emit connectionAcquired();
+}
+
+void Connection::remove()
+{
+ // Disconnect all signals from the transfer
+ if (m_curTransfer)
+ m_curTransfer->QObject::disconnect(this);
+
+ m_curTransfer = 0L;
+ m_busy = false;
+
+ emit connectionRemoved();
+ emit static_cast<Session*>(parent())->freeConnectionAvailable();
+}
+
+void Connection::abort()
+{
+ if (m_aborting || !m_client->socket()->isBusy())
+ return;
+
+ // Emit the signal before aborting
+ emit aborting();
+
+ // Abort transfer
+ m_aborting = true;
+ m_client->abort();
+ m_aborting = false;
+}
+
+void Connection::scanDirectory(KFTPQueue::Transfer *parent)
+{
+ // Lock the connection and the transfer
+ acquire(parent);
+ parent->lock();
+
+ m_scanning = true;
+
+ if (isConnected())
+ m_client->scan(parent->getSourceUrl());
+}
+
+void Connection::addScannedDirectory(KFTPEngine::DirectoryTree *tree, KFTPQueue::Transfer *parent)
+{
+ // Directories
+ DirectoryTree::DirIterator dirEnd = tree->directories()->end();
+ for (DirectoryTree::DirIterator i = tree->directories()->begin(); i != dirEnd; i++) {
+ KURL sourceUrlBase = parent->getSourceUrl();
+ KURL destUrlBase = parent->getDestUrl();
+
+ sourceUrlBase.addPath((*i)->info().filename());
+ destUrlBase.addPath((*i)->info().filename());
+
+ // Check if we should skip this entry
+ const ActionChain *actionChain = Filters::self()->process(sourceUrlBase, 0, true);
+
+ if (actionChain && actionChain->getAction(Action::Skip))
+ continue;
+
+ // Add directory transfer
+ KFTPQueue::TransferDir *transfer = new KFTPQueue::TransferDir(parent);
+ transfer->setSourceUrl(sourceUrlBase);
+ transfer->setDestUrl(destUrlBase);
+ transfer->setTransferType(parent->getTransferType());
+ transfer->setId(KFTPQueue::Manager::self()->nextTransferId());
+
+ emit KFTPQueue::Manager::self()->newTransfer(transfer);
+
+ addScannedDirectory(*i, transfer);
+
+ if (KFTPCore::Config::skipEmptyDirs() && !transfer->hasChildren())
+ KFTPQueue::Manager::self()->removeTransfer(transfer, false);
+ }
+
+ // Files
+ DirectoryTree::FileIterator fileEnd = tree->files()->end();
+ for (DirectoryTree::FileIterator i = tree->files()->begin(); i != fileEnd; i++) {
+ KURL sourceUrlBase = parent->getSourceUrl();
+ KURL destUrlBase = parent->getDestUrl();
+
+ sourceUrlBase.addPath((*i).filename());
+ destUrlBase.addPath((*i).filename());
+
+ // Check if we should skip this entry
+ const ActionChain *actionChain = Filters::self()->process(sourceUrlBase, (*i).size(), false);
+
+ if (actionChain && actionChain->getAction(Action::Skip))
+ continue;
+
+ // Add file transfer
+ KFTPQueue::TransferFile *transfer = new KFTPQueue::TransferFile(parent);
+ transfer->addSize((*i).size());
+ transfer->setSourceUrl(sourceUrlBase);
+ transfer->setDestUrl(destUrlBase);
+ transfer->setTransferType(parent->getTransferType());
+ transfer->setId(KFTPQueue::Manager::self()->nextTransferId());
+
+ emit KFTPQueue::Manager::self()->newTransfer(transfer);
+ }
+}
+
+void Connection::slotEngineEvent(KFTPEngine::Event *event)
+{
+ switch (event->type()) {
+ case Event::EventDisconnect: {
+ emit connectionLost(this);
+ break;
+ }
+ case Event::EventConnect: {
+ emit connectionEstablished();
+
+ if (m_scanning) {
+ // Connected successfully, let's scan
+ m_client->scan(m_curTransfer->getSourceUrl());
+ }
+ break;
+ }
+ case Event::EventError: {
+ ErrorCode error = event->getParameter(0).asErrorCode();
+
+ if (m_scanning && (error == ConnectFailed || error == LoginFailed || error == OperationFailed)) {
+ // Scanning should be aborted, since there was an error
+ m_scanning = false;
+ m_curTransfer->unlock();
+ remove();
+
+ emit static_cast<Session*>(parent())->dirScanDone();
+ }
+ break;
+ }
+ case Event::EventScanComplete: {
+ if (m_scanning) {
+ // We have the listing
+ DirectoryTree *tree = static_cast<DirectoryTree*>(event->getParameter(0).asData());
+ addScannedDirectory(tree, m_curTransfer);
+ delete tree;
+
+ m_scanning = false;
+ m_curTransfer->unlock();
+ remove();
+
+ emit static_cast<Session*>(parent())->dirScanDone();
+ }
+ break;
+ }
+ default: break;
+ }
+}
+
+void Connection::slotTransferCompleted()
+{
+ // Remove the lock
+ remove();
+}
+
+void Connection::reconnect()
+{
+ if (!m_client->socket()->isConnected()) {
+ KFTPBookmarks::Manager::self()->setupClient(static_cast<Session*>(parent())->getSite(), m_client);
+ m_client->connect(m_client->socket()->getCurrentUrl());
+ }
+}
+
+////////////////////////////////////////////////////////
+//////////////////// Session ////////////////////
+////////////////////////////////////////////////////////
+
+Session::Session(Side side)
+ : QObject(),
+ m_side(side),
+ m_remote(false),
+ m_aborting(false),
+ m_registred(false),
+ m_site(0)
+{
+ // Register this session
+ Manager::self()->registerSession(this);
+}
+
+Session::~Session()
+{
+}
+
+KFTPEngine::Thread *Session::getClient()
+{
+ // Return the first (core) connection's client
+ return m_connections.at(0)->getClient();
+}
+
+bool Session::isConnected()
+{
+ // If there are no connections, just check if the session is remote
+ if (m_connections.count() == 0)
+ return !m_remote;
+
+ return m_connections.at(0)->isConnected();
+}
+
+void Session::slotClientEngineEvent(KFTPEngine::Event *event)
+{
+ switch (event->type()) {
+ case Event::EventConnect: {
+ // ***************************************************************************
+ // ****************************** EventConnect *******************************
+ // ***************************************************************************
+ m_remote = true;
+ m_aborting = false;
+ m_lastUrl = getClient()->socket()->getCurrentUrl();
+
+ QString siteName;
+ if (m_site)
+ siteName = m_site->getAttribute("name");
+ else
+ siteName = m_lastUrl.host();
+
+ Manager::self()->getTabs(m_side)->changeTab(m_fileView, siteName);
+ Manager::self()->getStatTabs()->changeTab(m_log, i18n("Log (%1)").arg(siteName));
+ Manager::self()->getStatTabs()->showPage(m_log);
+ Manager::self()->doEmitUpdate();
+
+ KURL homeUrl = getClient()->socket()->getCurrentUrl();
+
+ if (m_site && !m_site->getProperty("defremotepath").isEmpty())
+ homeUrl.setPath(m_site->getProperty("defremotepath"));
+ else
+ homeUrl.setPath(getClient()->socket()->getDefaultDirectory());
+
+ m_fileView->setHomeUrl(homeUrl);
+ m_fileView->goHome();
+
+ Session *opposite = Manager::self()->getActive(oppositeSide(m_side));
+
+ if (m_site && !opposite->isRemote()) {
+ QString localPath = m_site->getProperty("deflocalpath");
+
+ if (!localPath.isEmpty())
+ opposite->getFileView()->openUrl(KURL(localPath));
+ }
+ break;
+ }
+ case Event::EventDisconnect: {
+ // ***************************************************************************
+ // **************************** EventDisconnect ******************************
+ // ***************************************************************************
+ m_remote = false;
+ m_aborting = false;
+
+ Manager::self()->getTabs(m_side)->changeTab(m_fileView, i18n("Local Session"));
+ Manager::self()->getStatTabs()->changeTab(m_log, "[" + i18n("Log") + "]");
+ Manager::self()->doEmitUpdate();
+
+ m_fileView->setHomeUrl(KURL(KFTPCore::Config::defLocalDir()));
+ m_fileView->goHome();
+ break;
+ }
+ case Event::EventCommand: m_log->ftpLog(1, event->getParameter(0).asString()); break;
+ case Event::EventMultiline: m_log->ftpLog(2, event->getParameter(0).asString()); break;
+ case Event::EventResponse: m_log->ftpLog(0, event->getParameter(0).asString()); break;
+ case Event::EventMessage: m_log->ftpLog(3, event->getParameter(0).asString()); break;
+ case Event::EventRetrySuccess: {
+ // ***************************************************************************
+ // ************************** EventRetrySuccess ******************************
+ // ***************************************************************************
+ if (KFTPCore::Config::showRetrySuccessBalloon()) {
+ KFTPWidgets::SystemTray::self()->showBalloon(i18n("Connection with %1 has been successfully established.").arg(getClient()->socket()->getCurrentUrl().host()));
+ }
+ break;
+ }
+ case Event::EventReloadNeeded: {
+ // We should only do refreshes if the queue is not being processed
+ if (KFTPQueue::Manager::self()->getNumRunning() == 0)
+ m_fileView->reload();
+ break;
+ }
+ case Event::EventPubkeyPassword: {
+ // A public-key authentication password was requested
+ QCString pass;
+ int ret = KPasswordDialog::getPassword(pass, i18n("Please provide your private key decryption password."));
+
+ if (ret == KPasswordDialog::Accepted) {
+ PubkeyWakeupEvent *event = new PubkeyWakeupEvent();
+ event->password = pass;
+
+ getClient()->wakeup(event);
+ } else {
+ getClient()->abort();
+ }
+ break;
+ }
+ default: break;
+ }
+}
+
+void Session::scanDirectory(KFTPQueue::Transfer *parent, Connection *connection)
+{
+ // Go trough all files in path and add them as transfers that have parent as their parent
+ // transfer
+ KURL path = parent->getSourceUrl();
+
+ if (path.isLocalFile()) {
+ connect(new DirectoryScanner(parent), SIGNAL(completed()), this, SIGNAL(dirScanDone()));
+ } else if (m_remote) {
+ if (!connection) {
+ if (!isFreeConnection()) {
+ emit dirScanDone();
+ return;
+ }
+
+ // Assign a new connection (it might be unconnected!)
+ connection = assignConnection();
+ }
+
+ connection->scanDirectory(parent);
+ }
+}
+
+void Session::abort()
+{
+ if (m_aborting)
+ return;
+
+ m_aborting = true;
+
+ emit aborting();
+
+ // Abort all connections
+ Connection *conn;
+ for (conn = m_connections.first(); conn; conn = m_connections.next()) {
+ conn->abort();
+ }
+
+ m_aborting = false;
+}
+
+void Session::reconnect(const KURL &url)
+{
+ // Set the reconnect url
+ m_reconnectUrl = url;
+
+ if (m_remote && getClient()->socket()->isConnected()) {
+ abort();
+
+ connect(getClient()->eventHandler(), SIGNAL(disconnected()), this, SLOT(slotStartReconnect()));
+ getClient()->disconnect();
+ } else {
+ // The session is already disconnected, just call the slot
+ slotStartReconnect();
+ }
+}
+
+void Session::slotStartReconnect()
+{
+ disconnect(getClient()->eventHandler(), SIGNAL(disconnected()), this, SLOT(slotStartReconnect()));
+
+ // Reconnect only if this is a remote url
+ if (!m_reconnectUrl.isLocalFile()) {
+ KFTPBookmarks::Manager::self()->setupClient(m_site, getClient());
+ getClient()->connect(m_reconnectUrl);
+ }
+
+ // Invalidate the url
+ m_reconnectUrl = KURL();
+}
+
+int Session::getMaxThreadCount()
+{
+ // First get the global thread count
+ int count = KFTPCore::Config::threadCount();
+
+ if (!KFTPCore::Config::threadUsePrimary())
+ count++;
+
+ // Try to see if threads are disabled for this site
+ if (count > 1 && isRemote()) {
+ if (m_site && m_site->getIntProperty("disableThreads"))
+ return 1;
+ }
+
+ return count;
+}
+
+bool Session::isFreeConnection()
+{
+ unsigned int max = getMaxThreadCount();
+ unsigned int free = 0;
+
+ if ((m_connections.count() < max && max > 1) || !isRemote())
+ return true;
+
+ Connection *conn;
+ for (conn = m_connections.first(); conn; conn = m_connections.next()) {
+ if (!conn->isBusy() && (!conn->isPrimary() || KFTPCore::Config::threadUsePrimary() || max == 1))
+ free++;
+ }
+
+ return free > 0;
+}
+
+Connection *Session::assignConnection()
+{
+ unsigned int max = getMaxThreadCount();
+
+ if (m_connections.count() == 0) {
+ // We need a new core connection
+ Connection *conn = new Connection(this, true);
+ m_connections.append(conn);
+
+ Manager::self()->doEmitUpdate();
+
+ return conn;
+ } else {
+ // Find a free connection
+ Connection *conn;
+ for (conn = m_connections.first(); conn; conn = m_connections.next()) {
+ if (!conn->isBusy() && (!conn->isPrimary() || KFTPCore::Config::threadUsePrimary() || max == 1))
+ return conn;
+ }
+
+ // No free connection has been found, but we may be able to create
+ // another (if we are within limits)
+ if (m_connections.count() < max) {
+ conn = new Connection(this);
+ m_connections.append(conn);
+
+ Manager::self()->doEmitUpdate();
+
+ return conn;
+ }
+ }
+
+ return 0;
+}
+
+void Session::disconnectAllConnections()
+{
+ // Abort any possible transfers first
+ abort();
+
+ // Now disconnect all connections
+ Connection *conn;
+
+ for (conn = m_connections.first(); conn; conn = m_connections.next()) {
+ if (conn->getClient()->socket()->isConnected()) {
+ conn->getClient()->disconnect();
+ }
+ }
+}
+
+////////////////////////////////////////////////////////
+/////////////////////// Manager ////////////////////////
+////////////////////////////////////////////////////////
+
+Manager *Manager::m_self = 0;
+
+Manager *Manager::self()
+{
+ return m_self;
+}
+
+Manager::Manager(QObject *parent, QTabWidget *stat, KFTPTabWidget *left, KFTPTabWidget *right)
+ : QObject(parent),
+ m_statTabs(stat),
+ m_leftTabs(left),
+ m_rightTabs(right),
+ m_active(0),
+ m_leftActive(0),
+ m_rightActive(0)
+{
+ Manager::m_self = this;
+
+ // Connect some signals
+ connect(left, SIGNAL(currentChanged(QWidget*)), this, SLOT(slotActiveChanged(QWidget*)));
+ connect(right, SIGNAL(currentChanged(QWidget*)), this, SLOT(slotActiveChanged(QWidget*)));
+
+ connect(left, SIGNAL(closeRequest(QWidget*)), this, SLOT(slotSessionCloseRequest(QWidget*)));
+ connect(right, SIGNAL(closeRequest(QWidget*)), this, SLOT(slotSessionCloseRequest(QWidget*)));
+}
+
+void Manager::registerSession(Session *session)
+{
+ m_active = session;
+
+ // Create some new stuff and assign it to the session
+ session->assignConnection();
+ session->m_fileView = new KFTPWidgets::Browser::View(0L, "", session->getClient(), session);
+ session->m_log = new KFTPWidgets::LogView();
+
+ // Install event filters
+ session->getFileView()->getDetailsView()->installEventFilter(this);
+ session->getFileView()->getTreeView()->installEventFilter(this);
+ session->getFileView()->m_toolBarFirst->installEventFilter(this);
+ session->getFileView()->m_toolBarSecond->installEventFilter(this);
+
+ connect(session->getFileView()->getDetailsView(), SIGNAL(clicked(QListViewItem*)), this, SLOT(slotSwitchFocus()));
+ connect(session->getFileView()->getTreeView(), SIGNAL(clicked(QListViewItem*)), this, SLOT(slotSwitchFocus()));
+ connect(session->getFileView()->m_toolBarFirst, SIGNAL(clicked(int)), this, SLOT(slotSwitchFocus()));
+ connect(session->getFileView()->m_toolBarSecond, SIGNAL(clicked(int)), this, SLOT(slotSwitchFocus()));
+
+ // Connect some signals
+ connect(session->getClient()->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), session, SLOT(slotClientEngineEvent(KFTPEngine::Event*)));
+
+ // Assign GUI positions
+ m_statTabs->addTab(session->m_log, "[" + i18n("Log") + "]");
+ getTabs(session->m_side)->addTab(session->m_fileView, KFTPGrabberBase::loadSmallIcon("system"), i18n("Session"));
+
+ // Actually add the session
+ m_sessionList.append(session);
+ session->m_registred = true;
+}
+
+KFTPWidgets::Browser::View *Manager::getActiveView()
+{
+ if (m_active)
+ return m_active->getFileView();
+
+ return 0;
+}
+
+Session *Manager::getActiveSession()
+{
+ return m_active;
+}
+
+bool Manager::eventFilter(QObject *object, QEvent *event)
+{
+ if (event->type() == QEvent::FocusIn || event->type() == QEvent::MouseButtonPress) {
+ switchFocusToObject(object);
+ }
+
+ return false;
+}
+
+void Manager::slotSwitchFocus()
+{
+ switchFocusToObject(QObject::sender());
+}
+
+void Manager::switchFocusToObject(const QObject *object)
+{
+ if (!object)
+ return;
+
+ for (;;) {
+ if (object->isA("KFTPWidgets::Browser::View"))
+ break;
+
+ if (!(object = object->parent()))
+ break;
+ }
+
+ if (object) {
+ // We have the proper object
+ Session *session = find(static_cast<const KFTPWidgets::Browser::View*>(object));
+
+ if (session && session != m_active) {
+ m_active = session;
+
+ // Open the current session's log tab
+ if (session->isRemote())
+ m_statTabs->showPage(session->getLog());
+ }
+ }
+}
+
+void Manager::unregisterSession(Session *session)
+{
+ // Destroy all objects related to the session and remove it
+ getTabs(session->m_side)->removePage(session->m_fileView);
+ m_statTabs->removePage(session->m_log);
+
+ if (session->getClient()->socket()->isConnected()) {
+ session->abort();
+ session->getClient()->disconnect();
+ }
+
+ // Delete objects
+ session->m_fileView->deleteLater();
+ session->m_log->deleteLater();
+
+ // Actually remove the session
+ m_sessionList.remove(session);
+ delete session;
+
+ // Emit update
+ emit update();
+}
+
+void Manager::doEmitUpdate()
+{
+ emit update();
+}
+
+void Manager::disconnectAllSessions()
+{
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next())
+ i->disconnectAllConnections();
+}
+
+Session *Manager::find(KFTPEngine::Thread *client)
+{
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next()) {
+ if (i->getClient() == client)
+ return i;
+ }
+
+ return 0L;
+}
+
+Session *Manager::find(KFTPWidgets::Browser::View *fileView)
+{
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next()) {
+ if (i->m_fileView == fileView)
+ return i;
+ }
+
+ return 0L;
+}
+
+Session *Manager::find(KFTPWidgets::LogView *log)
+{
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next()) {
+ if (i->m_log == log)
+ return i;
+ }
+
+ return 0L;
+}
+
+Session *Manager::find(const KURL &url, bool mustUnlock)
+{
+ if (url.isLocalFile())
+ return find(true);
+
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next()) {
+ KURL tmp = i->getClient()->socket()->getCurrentUrl();
+ tmp.setPath(url.path());
+
+ if (tmp == url && i->isRemote() && i->isConnected() && (!mustUnlock || i->isFreeConnection()))
+ return i;
+ }
+
+ return 0L;
+}
+
+Session *Manager::find(bool local)
+{
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next()) {
+ if (i->m_remote != local)
+ return i;
+ }
+
+ return 0L;
+}
+
+Session *Manager::findLast(const KURL &url, Side side)
+{
+ if (url.isLocalFile())
+ return find(true);
+
+ Session *i;
+
+ for (i = m_sessionList.first(); i; i = m_sessionList.next()) {
+ KURL tmp = i->m_lastUrl;
+ tmp.setPath(url.path());
+
+ if (tmp == url && !i->isRemote() && (i->getSide() || side == IgnoreSide))
+ return i;
+ }
+
+ return 0L;
+}
+
+Session *Manager::spawnLocalSession(Side side, bool forceNew)
+{
+ // Creates a new local session
+ Session *session = 0L;
+
+ if (forceNew || (session = find(true)) == 0L || (session->m_side != side && side != IgnoreSide)) {
+ side = side == IgnoreSide ? LeftSide : side;
+
+ session = new Session(side);
+ session->m_remote = false;
+ getTabs(side)->changeTab(session->m_fileView, i18n("Local Session"));
+ getStatTabs()->changeTab(session->m_log, "[" + i18n("Log") + "]");
+ }
+
+ setActive(session);
+ return session;
+}
+
+Session *Manager::spawnRemoteSession(Side side, const KURL &remoteUrl, KFTPBookmarks::Site *site, bool mustUnlock)
+{
+ // Creates a new remote session and connects it to the correct server
+ Session *session;
+
+ if (remoteUrl.isLocalFile())
+ return spawnLocalSession(side);
+
+ if ((session = find(remoteUrl, mustUnlock)) == 0L || (session->m_side != side && side != IgnoreSide)) {
+ // Try to find the session that was last connected to this URL
+ if ((session = findLast(remoteUrl, side)) == 0L) {
+ // Attempt to reuse a local session if one exists one the right side
+ session = getActive(RightSide);
+
+ if (session->isRemote()) {
+ side = side == IgnoreSide ? RightSide : side;
+ session = new Session(side);
+ }
+ }
+
+ // Try to find the site by url if it is not set
+ if (!site)
+ site = KFTPBookmarks::Manager::self()->findSite(remoteUrl);
+
+ // Set properties
+ session->m_remote = true;
+ session->m_site = site;
+ m_active = session;
+
+ KFTPBookmarks::Manager::self()->setupClient(site, session->getClient());
+ session->getClient()->connect(remoteUrl);
+ }
+
+ return session;
+}
+
+void Manager::setActive(Session *session)
+{
+ // Make a session active on its own side ;)
+ Session *oldActive = getActive(session->m_side);
+
+ oldActive ? oldActive->m_active = false : 0;
+ session->m_active = true;
+
+ switch (session->m_side) {
+ case LeftSide: m_leftActive = session; break;
+ case RightSide: m_rightActive = session; break;
+ case IgnoreSide: qDebug("Invalid side specified!"); return;
+ }
+
+ // Refresh the GUI
+ getTabs(session->m_side)->showPage(session->m_fileView);
+}
+
+Session *Manager::getActive(Side side)
+{
+ switch (side) {
+ case LeftSide: return m_leftActive;
+ case RightSide: return m_rightActive;
+ case IgnoreSide: qDebug("Invalid side specified!"); break;
+ }
+
+ return NULL;
+}
+
+KFTPTabWidget *Manager::getTabs(Side side)
+{
+ switch (side) {
+ case LeftSide: return m_leftTabs;
+ case RightSide: return m_rightTabs;
+ case IgnoreSide: qDebug("Invalid side specified!"); break;
+ }
+
+ return NULL;
+}
+
+void Manager::slotActiveChanged(QWidget *page)
+{
+ Session *session = find(static_cast<KFTPWidgets::Browser::View*>(page));
+ setActive(session);
+}
+
+void Manager::slotSessionCloseRequest(QWidget *page)
+{
+ Session *session = find(static_cast<KFTPWidgets::Browser::View*>(page));
+
+ if (getTabs(session->m_side)->count() == 1) {
+ KMessageBox::error(0L, i18n("At least one session must remain open on each side."));
+ return;
+ }
+
+ if ((session->m_remote && session->getClient()->socket()->isBusy()) || !session->isFreeConnection()) {
+ KMessageBox::error(0L, i18n("Please finish all transfers before closing the session."));
+ return;
+ } else {
+ // Remove the session
+ if (session->getClient()->socket()->isConnected()) {
+ if (KMessageBox::questionYesNo(0L, i18n("This session is currently connected. Are you sure you wish to disconnect?"), i18n("Close Session")) == KMessageBox::No)
+ return;
+ }
+
+ unregisterSession(session);
+ }
+}
+
+}
+
+#include "kftpsession.moc"
diff --git a/kftpgrabber/src/kftpsession.h b/kftpgrabber/src/kftpsession.h
new file mode 100644
index 0000000..9e95213
--- /dev/null
+++ b/kftpgrabber/src/kftpsession.h
@@ -0,0 +1,616 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPSESSION_H
+#define KFTPSESSION_H
+
+#include <qobject.h>
+#include <qguardedptr.h>
+#include <qdom.h>
+
+#include <qlistview.h>
+
+#include "kftpqueue.h"
+#include "logview.h"
+#include "kftptabwidget.h"
+
+#include "engine/thread.h"
+
+namespace KFTPWidgets {
+ namespace Browser {
+ class Actions;
+ class View;
+ }
+}
+
+namespace KFTPBookmarks {
+ class Site;
+}
+
+namespace KFTPSession {
+
+class Session;
+
+enum Side {
+ LeftSide,
+ RightSide,
+ IgnoreSide
+};
+
+#define oppositeSide(x) (x == KFTPSession::LeftSide ? KFTPSession::RightSide : KFTPSession::LeftSide)
+
+/**
+ * The Connection class represents a session's connection to a ftp server. There
+ * can be many connections in the same session (to the same server), thus providing
+ * support for multiple threads at once.
+ *
+ * Individual transfers must acquire connections before they can use them. When a
+ * connection is acquired it cannot be used by another transfer or another remote
+ * operation.
+ *
+ * @author Jernej Kos
+ */
+class Connection : public QObject
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param session The parent session
+ * @param primary Set to true if this is session's primary connection
+ */
+ Connection(Session *session, bool primary = false);
+
+ /**
+ * Class destructor.
+ */
+ ~Connection();
+
+ /**
+ * Returns the client thread for this connection.
+ *
+ * @return A KFTPClientThr object representing a client.
+ */
+ KFTPEngine::Thread *getClient() const { return m_client; }
+
+ /**
+ * Returns the URL this connection is connected to.
+ *
+ * @return A KURL this connection is connected to.
+ */
+ KURL getUrl() { return m_client->socket()->getCurrentUrl(); }
+
+ /**
+ * Returns the current transfer if this connection is locked by one. If
+ * it isn't locked NULL will be returned.
+ */
+ KFTPQueue::Transfer *getTransfer() const { return m_curTransfer; }
+
+ /**
+ * Lock this connection for a specific transfer. While the connection is
+ * locked no other transfer may use it. The connection will be automaticly
+ * unlocked when the transfer completes.
+ *
+ * @param transfer The transfer which is locking this connection.
+ */
+ void acquire(KFTPQueue::Transfer *transfer);
+
+ /**
+ * Clear existing connection lock. Only the transfer who locked the connection
+ * should do this!
+ */
+ void remove();
+
+ /**
+ * Abort any actions going via this connection. It will call abort on the
+ * underlying client and emit the aborting signal.
+ */
+ void abort();
+
+ /**
+ * Connect to the previously connected URL. If this connection is already
+ * established this method does nothing.
+ */
+ void reconnect();
+
+ /**
+ * Is the current connection locked by some transfer ?
+ *
+ * @return Returns true if the current connection is locked, false otherwise.
+ */
+ bool isBusy() const { return m_busy; }
+
+ /**
+ * Is the current connection actually connected to a server ?
+ *
+ * @return Returns true if a connection to a server is established.
+ */
+ bool isConnected();
+
+ /**
+ * Is the current connection the primary session connection ?
+ *
+ * @return Returns true if the current connection is primary, false otherwise
+ */
+ bool isPrimary() const { return m_primary; }
+
+ /**
+ * Scans a directory - usually called from KFTPSession for remote scans.
+ *
+ * @param parent The transfer that requested the scan
+ */
+ void scanDirectory(KFTPQueue::Transfer *parent);
+private:
+ void addScannedDirectory(KFTPEngine::DirectoryTree *tree, KFTPQueue::Transfer *parent);
+private:
+ bool m_primary;
+ bool m_busy;
+ bool m_aborting;
+ bool m_scanning;
+
+ QGuardedPtr<KFTPQueue::Transfer> m_curTransfer;
+ KFTPEngine::Thread *m_client;
+private slots:
+ void slotTransferCompleted();
+
+ void slotEngineEvent(KFTPEngine::Event *event);
+signals:
+ /**
+ * This signal gets emitted when the connection is acquired for exclusive
+ * use by a transfer.
+ */
+ void connectionAcquired();
+
+ /**
+ * This signal gets emitted when connection is returned to the pool and is
+ * no longer locked.
+ */
+ void connectionRemoved();
+
+ /**
+ * This signal gets emitted when the connection is lost.
+ *
+ * @param connection This connection instance
+ */
+ void connectionLost(KFTPSession::Connection *connection);
+
+ /**
+ * This signal gets emitted when connection with the remote server is
+ * established.
+ */
+ void connectionEstablished();
+
+ /**
+ * This signal gets emitted when this connection is in the process of
+ * aborting any currently running operations.
+ */
+ void aborting();
+};
+
+/**
+ * A Session instance connects all the relevant elements together. Via the
+ * manager this abstraction allows many independent sessions inside one
+ * applications.
+ *
+ * Each session can either be local or remote. A remote session can have
+ * multiple connections open (each connection is represented by a Connection
+ * instance).
+ *
+ * @author Jernej Kos
+ */
+class Session : public QObject
+{
+Q_OBJECT
+friend class KFTPWidgets::Browser::Actions;
+friend class Manager;
+friend class Connection;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param side The side the session should be located on
+ */
+ Session(Side side);
+
+ /**
+ * Class destructor.
+ */
+ ~Session();
+
+ /**
+ * Has the session registration procedure already been completed ?
+ *
+ * @return True if the registration procedure has been completed, false otherwise
+ */
+ bool isRegistred() const { return m_registred; }
+
+ /**
+ * Is this a remote session ?
+ *
+ * @return Returns true if this is a remote session.
+ */
+ bool isRemote() const { return m_remote; }
+
+ /**
+ * Is this session currently active (=visible to the user) ?
+ *
+ * @return Returns true if this session is currently active.
+ */
+ bool isActive() const { return m_active; }
+
+ /**
+ * Is this session currently connected to a server ? This actually checks if
+ * the primary connection is connected to a server.
+ *
+ * @return Returns true if this session is connected to a server.
+ */
+ bool isConnected();
+
+ /**
+ * Get the site in bookmarks this session is asociated with or NULL if there
+ * is no such site.
+ *
+ * @return Returns the asociated bookmarks site.
+ */
+ KFTPBookmarks::Site *getSite() const { return m_site; }
+
+ /**
+ * Get the session's client thread. This actually returns the client thread
+ * of the primary session's connection.
+ *
+ * @return A KFTPEngine::Thread object representing a client.
+ */
+ KFTPEngine::Thread *getClient();
+
+ /**
+ * Get this session's log widget.
+ *
+ * @return Returns the session's log widget.
+ */
+ KFTPWidgets::LogView *getLog() const { return m_log; }
+
+ /**
+ * Get this session's file view.
+ *
+ * @return Returns the session's file view.
+ */
+ KFTPWidgets::Browser::View *getFileView() const { return m_fileView; }
+
+ /**
+ * Get the side on which this session is located.
+ *
+ * @return Returns the session's side.
+ */
+ Side getSide() const { return m_side; }
+
+ /**
+ * Set bookmark site asociation.
+ *
+ * @param site A valid site to which this session is asociated.
+ */
+ void setSite(KFTPBookmarks::Site *site) { m_site = site; }
+
+ /**
+ * Are there any free connections (or if some new can be created) to lock ?
+ *
+ * @return Returns true if there is a connection that can be locked.
+ */
+ bool isFreeConnection();
+
+ /**
+ * Assigns a free connection if there is one. A connection can be created if
+ * the limit hasn't yet been reached. If there are no free connections this
+ * method returns NULL.
+ *
+ * @return A free Connection or NULL if there is none.
+ */
+ Connection *assignConnection();
+
+ /**
+ * Disconnects all connections for this session.
+ */
+ void disconnectAllConnections();
+
+ /**
+ * Get the list of current connections for this session.
+ *
+ * @return A list of current connections.
+ */
+ QPtrList<Connection> *getConnectionList() { return &m_connections; }
+
+ /**
+ * Reconnect to a new URL. The current connections will be droped and reconnected
+ * to the new URL.
+ *
+ * @param url The URL to connect to.
+ */
+ void reconnect(const KURL &url);
+
+ /**
+ * Abort this session. This will actually call abort on all connections for
+ * this session.
+ */
+ void abort();
+
+ /**
+ * Initiate a directory scan, adding all new files and directories under the
+ * transfer specified as parent. This method will change the current transfer's
+ * status to Locked and will return imediately. The actual scan will take
+ * place in a separate thread.
+ *
+ * @param parent The transfer which requested the scan
+ * @param connection An optional connection to use
+ */
+ void scanDirectory(KFTPQueue::Transfer *parent, Connection *connection = 0);
+private:
+ Side m_side;
+ bool m_remote;
+ bool m_active;
+ bool m_aborting;
+ bool m_registred;
+
+ // Session description
+ KFTPBookmarks::Site *m_site;
+ KFTPWidgets::LogView *m_log;
+ KFTPWidgets::Browser::View *m_fileView;
+ KURL m_lastUrl;
+ KURL m_reconnectUrl;
+
+ // Connection list
+ QPtrList<Connection> m_connections;
+
+ int getMaxThreadCount();
+private slots:
+ void slotClientEngineEvent(KFTPEngine::Event *event);
+ void slotStartReconnect();
+signals:
+ void dirScanDone();
+ void aborting();
+
+ void freeConnectionAvailable();
+};
+
+typedef QPtrList<Session> SessionList;
+
+/**
+ * The Manager class provides access to sessions, their registration and deletion.
+ *
+ * @author Jernej Kos
+ */
+class Manager : public QObject
+{
+Q_OBJECT
+public:
+ /**
+ * Get a global manager instance.
+ */
+ static Manager *self();
+
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent object
+ * @param stat A widget that contains log tabs
+ * @param left A widget that contains sessions on the left side
+ * @param right A widget that contains sessions on the right side
+ */
+ Manager(QObject *parent, QTabWidget *stat, KFTPTabWidget *left, KFTPTabWidget *right);
+
+ /**
+ * Spawn a new local (=unconnected) session. This method may reuse an old local session.
+ *
+ * @param side The side on which the session should be created.
+ * @param forceNew Should a new session be created if a similar session already exists.
+ * @return Allways returns a valid session.
+ */
+ Session *spawnLocalSession(Side side, bool forceNew = false);
+
+ /**
+ * Spawn a new remote session. This method may reuse an old remote session. It may also
+ * spawn a new local session if the URL appears local.
+ *
+ * @param side The side on which the session should be created.
+ * @param remoteUrl URL to which the session should connect upon creation.
+ * @param site The bookmarked site the session is connecting to.
+ * @param mustUnlock Must the returned session be unlocked ?
+ * @return Allways returns a valid session.
+ */
+ Session *spawnRemoteSession(Side side, const KURL &remoteUrl, KFTPBookmarks::Site *site = 0, bool mustUnlock = false);
+
+ /**
+ * Register a new session with the session manager. Every session calls this method in
+ * its constructor to init the session - this method shouldn't be called otherwise.
+ *
+ * @param session A new session.
+ */
+ void registerSession(Session *session);
+
+ /**
+ * Destroy the session. All connections and transfers related to this session are
+ * aborted and disconnected first.
+ *
+ * @param session The session that is going to be destroyed.
+ */
+ void unregisterSession(Session *session);
+
+ /**
+ * Disconnects all sessions and their connections.
+ */
+ void disconnectAllSessions();
+
+ /**
+ * Find a session related to a client thread.
+ *
+ * @param client The client thread related to a session.
+ * @return Returns a valid session if one is found, NULL otherwise.
+ */
+ Session *find(KFTPEngine::Thread *client);
+
+ /**
+ * Find a session related to a file view widget.
+ *
+ * @param fileView The file view widget related to a session.
+ * @return Returns a valid session if one is found, NULL otherwise.
+ */
+ Session *find(KFTPWidgets::Browser::View *fileView);
+
+ /**
+ * Find a session related to a log widget.
+ *
+ * @param log The log widget related to a session.
+ * @return Returns a valid session if one is found, NULL otherwise.
+ */
+ Session *find(KFTPWidgets::LogView *log);
+
+ /**
+ * Find a session by the url it is connected to.
+ *
+ * @param url The URL a session is connected to.
+ * @param mustUnlock Must the session be unlocked ?
+ * @return Returns a valid session if one is found, NULL otherwise.
+ */
+ Session *find(const KURL &url, bool mustUnlock = false);
+
+ /**
+ * Finds a session by its state (remote/local).
+ *
+ * @param local Must a session be local ?
+ * @return Returns a valid session if one is found, NULL otherwise.
+ */
+ Session *find(bool local);
+
+ /**
+ * Finds a session that was last connected to a specific URL that is placed
+ * on a specific side.
+ *
+ * @param url The URL to which the session was connected to.
+ * @param side The side where the session must be.
+ * @return Returns a valid session if one is found, NULL otherwise.
+ */
+ Session *findLast(const KURL &url, Side side);
+
+ /**
+ * Get the list of all sessions in existance.
+ *
+ * @return The session list.
+ */
+ SessionList *getSessionList() { return &m_sessionList; }
+
+ /**
+ * Emits the update signal.
+ */
+ void doEmitUpdate();
+
+ /**
+ * Returns the tab widget that holds the log widgets.
+ *
+ * @return Returns a QTabWidget that holds the log widgets.
+ */
+ QTabWidget *getStatTabs() const { return m_statTabs; }
+
+ /**
+ * Returns the tab widget that holds the sessions on a specific side.
+ *
+ * @param side The side of the tab widget.
+ * @return Returns a KFTPTabWidget that holds the sessions.
+ */
+ KFTPTabWidget *getTabs(Side side);
+
+ /**
+ * Make a session active (=visible to the user).
+ *
+ * @param session Session to be made active.
+ */
+ void setActive(Session *session);
+
+ /**
+ * Get the active session on a specific side.
+ *
+ * @param side The side where the session is active.
+ * @return Returns a valid session.
+ */
+ Session *getActive(Side side);
+
+ /**
+ * Get the currently active view.
+ *
+ * @return The active view instance
+ */
+ KFTPWidgets::Browser::View *getActiveView();
+
+ /**
+ * Get the currently active session.
+ */
+ Session *getActiveSession();
+protected:
+ static Manager *m_self;
+
+ /**
+ * Event filter handler.
+ */
+ bool eventFilter(QObject *object, QEvent *event);
+
+ /**
+ * Change the currently active session to the browser view inheriting
+ * the passed object.
+ *
+ * @param object The object that has browser view as some parent
+ */
+ void switchFocusToObject(const QObject *object);
+private:
+ SessionList m_sessionList;
+
+ // These variables should be assigned right after construction
+ QTabWidget *m_statTabs;
+ KFTPTabWidget *m_leftTabs;
+ KFTPTabWidget *m_rightTabs;
+
+ // Currently active sessions
+ Session *m_active;
+ Session *m_leftActive;
+ Session *m_rightActive;
+private slots:
+ void slotActiveChanged(QWidget *page);
+ void slotSwitchFocus();
+public slots:
+ void slotSessionCloseRequest(QWidget *page);
+signals:
+ void update();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/kftptransfer.cpp b/kftpgrabber/src/kftptransfer.cpp
new file mode 100644
index 0000000..3c127ba
--- /dev/null
+++ b/kftpgrabber/src/kftptransfer.cpp
@@ -0,0 +1,374 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftptransfer.h"
+#include "kftptransferdir.h"
+#include "widgets/systemtray.h"
+#include "kftpqueue.h"
+#include "kftpsession.h"
+
+#include "misc/config.h"
+
+#include <klocale.h>
+
+using namespace KFTPSession;
+
+namespace KFTPQueue {
+
+FailedTransfer::FailedTransfer(QObject *parent, TransferFile *transfer, const QString &error)
+ : QObject(parent),
+ m_transfer(transfer),
+ m_error(error)
+{
+ // Check if the transfer's site should be removed as well
+ QueueObject *site = 0;
+ if (transfer->parentObject()->getType() == QueueObject::Site && transfer->parentObject()->getChildrenList().count() == 1)
+ site = transfer->parentObject();
+
+ // Reparent the transfer, we can't remove it from the QueueObject's children list yet, because
+ // that will cause an iterator reset for directories, so we'll do that later in the fail method.
+ transfer->parentObject()->addSize(-transfer->m_actualSize);
+
+ transfer->parent()->removeChild(transfer);
+ insertChild(transfer);
+ KFTPQueue::Manager::self()->getFailedTransferList()->append(this);
+
+ // Check if the transfer's site should be removed as well
+ if (site) {
+ emit KFTPQueue::Manager::self()->siteRemoved(site->getId());
+ delete site;
+ }
+
+ // Mark transfer as failed
+ transfer->m_status = Transfer::Failed;
+}
+
+FailedTransfer::~ FailedTransfer()
+{
+}
+
+TransferFile *FailedTransfer::restore()
+{
+ // Emit failed transfer removal
+ emit KFTPQueue::Manager::self()->failedTransferRemoved(m_transfer->getId());
+
+ // Add the transfer back to the queue
+ removeChild(m_transfer);
+ KFTPQueue::Manager::self()->insertTransfer(m_transfer);
+
+ // Change the transfer's status, so it can be started
+ m_transfer->m_status = Transfer::Stopped;
+
+ // This object is now useless, so it shall be removed
+ KFTPQueue::Manager::self()->getFailedTransferList()->remove(this);
+ deleteLater();
+
+ return m_transfer;
+}
+
+void FailedTransfer::fail(TransferFile *transfer, const QString &error)
+{
+ // Should the transfer be retried
+ if (KFTPCore::Config::failedAutoRetry() && transfer->m_retryCount < KFTPCore::Config::failedAutoRetryCount()) {
+ // Semi-reset the current transfer
+ transfer->addCompleted(-transfer->m_completed);
+
+ transfer->m_retryCount++;
+ transfer->m_resumed = 0;
+ transfer->m_completed = 0;
+ transfer->m_aborting = false;
+ transfer->m_size = transfer->m_actualSize;
+
+ transfer->setSpeed(0);
+
+ // Restart the transfer
+ transfer->delayedExecute();
+ } else {
+ // Abort the transfer
+ transfer->blockSignals(true);
+ transfer->abort();
+ transfer->blockSignals(false);
+
+ QGuardedPtr<QueueObject> transferParent(transfer->parentObject());
+
+ // Create a new failed transfer (will automaticly reparent the transfer)
+ FailedTransfer *ft = new FailedTransfer(KFTPQueue::Manager::self(), transfer, error);
+
+ // Notify others about transfer's "completion"
+ emit transfer->transferComplete(transfer->m_id);
+
+ // Now that the iterators have been incremented we can remove the child without
+ // doing any harm to the queue processing.
+ if (transferParent)
+ transferParent->delChildObject(transfer);
+
+ // Fake transfer removal and signal new failed transfer
+ emit KFTPQueue::Manager::self()->transferRemoved(transfer->m_id);
+ emit KFTPQueue::Manager::self()->failedTransferNew(ft);
+ }
+}
+
+Transfer::Transfer(QObject *parent, Type type)
+ : QueueObject(parent, type),
+ m_deleteMe(false),
+ m_openAfterTransfer(false),
+ m_srcSession(0),
+ m_dstSession(0),
+ m_srcConnection(0),
+ m_dstConnection(0),
+ m_retryCount(0)
+{
+}
+
+
+Transfer::~Transfer()
+{
+}
+
+Connection *Transfer::getOppositeConnection(Connection *conn)
+{
+ return m_srcConnection == conn ? m_dstConnection : m_srcConnection;
+}
+
+Connection *Transfer::remoteConnection()
+{
+ return m_srcConnection ? m_srcConnection : m_dstConnection;
+}
+
+Connection *Transfer::initializeSession(Session *session)
+{
+ if (!session->isFreeConnection()) {
+ // We should wait for a connection to come
+ connect(session, SIGNAL(freeConnectionAvailable()), this, SLOT(slotConnectionAvailable()));
+
+ if (m_status != Waiting) {
+ m_status = Waiting;
+ emit objectUpdated();
+ }
+
+ return 0;
+ }
+
+ Connection *connection = session->assignConnection();
+ connection->acquire(this);
+
+ connect(connection->getClient()->eventHandler(), SIGNAL(connected()), this, SLOT(slotConnectionConnected()));
+
+ return connection;
+}
+
+void Transfer::deinitializeConnections()
+{
+ if (m_srcConnection) {
+ m_srcConnection->getClient()->eventHandler()->disconnect(this);
+ m_srcConnection->remove();
+ }
+
+ if (m_dstConnection) {
+ m_dstConnection->getClient()->eventHandler()->disconnect(this);
+ m_dstConnection->remove();
+ }
+}
+
+bool Transfer::assignSessions(Session *source, Session *destination)
+{
+ bool result = true;
+
+ // We need a source session
+ if (!m_sourceUrl.isLocalFile() && !m_srcConnection) {
+ if (!source)
+ m_srcSession = KFTPSession::Manager::self()->spawnRemoteSession(IgnoreSide, m_sourceUrl, 0);
+ else
+ m_srcSession = source;
+
+ if (!(m_srcConnection = initializeSession(m_srcSession)))
+ result = false;
+ }
+
+ // We need a destination session
+ if (!m_destUrl.isLocalFile() && !m_dstConnection) {
+ if (!destination)
+ m_dstSession = KFTPSession::Manager::self()->spawnRemoteSession(m_srcSession ? oppositeSide(m_srcSession->getSide()) : IgnoreSide, m_destUrl, 0);
+ else
+ m_dstSession = destination;
+
+ if (!(m_dstConnection = initializeSession(m_dstSession)))
+ result = false;
+ }
+
+ return result;
+}
+
+bool Transfer::connectionsReady()
+{
+ return (m_sourceUrl.isLocalFile() || m_srcConnection) && (m_destUrl.isLocalFile() || m_dstConnection);
+}
+
+void Transfer::slotConnectionAvailable()
+{
+ if (getStatus() != Waiting || (m_srcSession && !m_srcSession->isFreeConnection()) || (m_dstSession && !m_dstSession->isFreeConnection()))
+ return;
+
+ if (m_srcSession)
+ m_srcSession->QObject::disconnect(this, SLOT(slotConnectionAvailable()));
+
+ if (m_dstSession)
+ m_dstSession->QObject::disconnect(this, SLOT(slotConnectionAvailable()));
+
+ // Connection has become available, grab it now
+ execute();
+}
+
+void Transfer::slotConnectionConnected()
+{
+ if ((m_srcConnection && !m_srcConnection->isConnected()) || (m_dstConnection && !m_dstConnection->isConnected()))
+ return;
+
+ // Everything is ready for immediate execution
+ delayedExecute();
+}
+
+void Transfer::faceDestruction(bool abortSession)
+{
+ // This method is called before the object is deleted by the queue
+ // manager.
+ if (hasParentObject()) {
+ parentObject()->addSize(-m_actualSize);
+ parentObject()->delChildObject(this);
+ }
+
+ // Abort any dir scans that might be in progress
+ if (abortSession) {
+ KFTPSession::Session *session = KFTPSession::Manager::self()->find(this);
+
+ if (session)
+ session->abort();
+ }
+}
+
+Transfer *Transfer::parentTransfer()
+{
+ if (!hasParentTransfer())
+ return 0L;
+
+ return static_cast<Transfer*>(parent());
+}
+
+void Transfer::resetTransfer()
+{
+ // Disconnect signals
+ if (getStatus() != Waiting) {
+ if (m_srcConnection)
+ m_srcConnection->getClient()->eventHandler()->QObject::disconnect(this, SLOT(slotConnectionConnected()));
+
+ if (m_dstConnection)
+ m_dstConnection->getClient()->eventHandler()->QObject::disconnect(this, SLOT(slotConnectionConnected()));
+ }
+
+ // Reset connections & session pointers
+ m_srcConnection = 0L;
+ m_dstConnection = 0L;
+
+ m_srcSession = 0L;
+ m_dstSession = 0L;
+
+ m_status = Stopped;
+ m_resumed = 0;
+ m_completed = 0;
+ m_aborting = false;
+ m_size = m_actualSize;
+ m_retryCount = 0;
+
+ // Set the transfer speed to zero
+ setSpeed(0);
+}
+
+bool Transfer::canMove()
+{
+ return !isRunning();
+}
+
+void Transfer::update()
+{
+ KFTPQueue::Manager::self()->doEmitUpdate();
+ emit objectUpdated();
+}
+
+void Transfer::abort()
+{
+ // Unlock if the transfer was locked
+ unlock();
+
+ // Set the aborting flag
+ m_aborting = true;
+
+ emit transferAbort(m_id);
+}
+
+void Transfer::showTransCompleteBalloon()
+{
+ // Show a balloon :P
+ if (KFTPCore::Config::showBalloons() && !KFTPQueue::Manager::self()->isProcessing()) {
+ if (!KFTPCore::Config::showBalloonWhenQueueEmpty() || (KFTPQueue::Manager::self()->topLevelObject()->getChildrenList().count() == 1 && !hasParentTransfer())) {
+ QString transCompleteStr = i18n("Transfer of the following files is complete:");
+ transCompleteStr += "<br><i>";
+ transCompleteStr += getSourceUrl().fileName();
+ transCompleteStr += "</i>";
+ KFTPWidgets::SystemTray::self()->showBalloon(transCompleteStr);
+ }
+ }
+}
+
+void Transfer::lock()
+{
+ // Transfers can only be locked if they are not currently running
+ if (m_status == Stopped) {
+ m_status = Locked;
+
+ emit objectUpdated();
+ }
+}
+
+void Transfer::unlock()
+{
+ if (isLocked()) {
+ m_status = Stopped;
+
+ emit objectUpdated();
+ }
+}
+
+}
+#include "kftptransfer.moc"
diff --git a/kftpgrabber/src/kftptransfer.h b/kftpgrabber/src/kftptransfer.h
new file mode 100644
index 0000000..78573a2
--- /dev/null
+++ b/kftpgrabber/src/kftptransfer.h
@@ -0,0 +1,337 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEKFTPTRANSFER_H
+#define KFTPQUEUEKFTPTRANSFER_H
+
+#include "queueobject.h"
+
+#include <qobject.h>
+#include <qtimer.h>
+#include <qguardedptr.h>
+
+#include <kurl.h>
+
+namespace KFTPSession {
+ class Session;
+ class Connection;
+}
+
+namespace KFTPQueue {
+
+enum TransferType {
+ Download = 0,
+ Upload = 1,
+ FXP = 2
+};
+
+class TransferFile;
+
+/**
+ * This class represents a failed transfer. Such a transfer is removed
+ * from queue so the error message can later be examined and the transfer
+ * restarted.
+ *
+ * @author Jernej Kos
+ */
+class FailedTransfer : public QObject
+{
+Q_OBJECT
+public:
+ /**
+ * Constructs a new failed transfer object. The actual transfer
+ * will be reparented (the FailedTransfer object will become its
+ * parent).
+ */
+ FailedTransfer(QObject *parent, TransferFile *transfer, const QString &error);
+ ~FailedTransfer();
+
+ /**
+ * Returns the error message.
+ *
+ * @return The error message.
+ */
+ QString getError() const { return m_error; }
+
+ /**
+ * Add this transfer back to the queue. The FailedTransfer object
+ * will be destroyed afterwards!
+ *
+ * @return Pointer to the TransferFile object that was just restored.
+ */
+ TransferFile *restore();
+
+ /**
+ * Returns the actual transfer object that failed. This transfer is
+ * marked as failed so execute() method can't be called!
+ *
+ * @return A KFTPQueue::TransferFile object.
+ */
+ TransferFile *getTransfer() const { return m_transfer; }
+
+ /**
+ * Use this method to declare a transfer as failed. The transfer will
+ * be aborted, removed from queue and added to the failed transfer
+ * list.
+ *
+ * @param transfer Pointer to the transfer object that failed.
+ * @param error The error that ocurred.
+ */
+ static void fail(TransferFile *transfer, const QString &error);
+private:
+ QGuardedPtr<TransferFile> m_transfer;
+ QString m_error;
+};
+
+/**
+ * This class is the base class for all transfers used in KFTPGrabber. It
+ * provides some basic methods that are extended by KFTPQueue::TransferFile and
+ * KFTPQueue::TransferDir for specific file or dir operations.
+ *
+ * @author Jernej Kos
+ */
+class Transfer : public QueueObject
+{
+friend class FailedTransfer;
+friend class TransferDir;
+friend class Manager;
+friend class KFTPSession::Session;
+friend class KFTPSession::Connection;
+Q_OBJECT
+public:
+ Transfer(QObject *parent, Type type);
+ ~Transfer();
+
+ /**
+ * Returns the source KURL of this transfer.
+ *
+ * @return Source url
+ */
+ KURL getSourceUrl() const { return m_sourceUrl; }
+
+ /**
+ * Returns the destination KURL of this transfer.
+ *
+ * @return Destination url
+ */
+ KURL getDestUrl() const { return m_destUrl; }
+
+ /**
+ * Set the source KURL of this transfer.
+ *
+ * @param url Source url wannabe
+ */
+ void setSourceUrl(const KURL &url) { m_sourceUrl = url; }
+
+ /**
+ * Set the destination url of this transfer.
+ *
+ * @param url Destination url wannabe
+ */
+ void setDestUrl(const KURL &url) { m_destUrl = url; }
+
+ /**
+ * Return the KFTPQueue::TransferType -- that is if this transfer is an Upload, Download
+ * or FXP transfer.
+ *
+ * @return Upload, Download or FXP
+ */
+ TransferType getTransferType() const { return m_transferType; }
+
+ /**
+ * Set current KFTPQueue::TransferType -- that is Upload, Download or FXP
+ *
+ * @param type Upload, Download or FXP
+ */
+ void setTransferType(TransferType type) { m_transferType = type; }
+
+ /**
+ * Get the source session for this transfer.
+ *
+ * @return A valid KFTPSession::Session instance or 0 if not started
+ */
+ KFTPSession::Session *getSourceSession() const { return m_srcSession; }
+
+ /**
+ * Get the destination session for this transfer.
+ *
+ * @return A valid KFTPSession::Session instance or 0 if not started
+ */
+ KFTPSession::Session *getDestinationSession() const { return m_dstSession; }
+
+ /**
+ * Returns the connection opposite of one that is passed. So if you
+ * pass the source connection, the destination one is returned and
+ * vice-versa.
+ *
+ * @param conn The connection
+ * @return The opposite Connection
+ */
+ KFTPSession::Connection *getOppositeConnection(KFTPSession::Connection *conn);
+
+ /**
+ * Returns the remote connection. If both connections are remote, this
+ * method returns the source connection.
+ *
+ * @return The remote connection
+ */
+ KFTPSession::Connection *remoteConnection();
+
+ /**
+ * Is this transfer a child of another transfer ?
+ *
+ * @return true if this transfer is a child of another KFTPQueue::Transfer
+ */
+ bool hasParentTransfer() const { return parent()->inherits("KFTPQueue::Transfer"); }
+
+ /**
+ * Should a transfered file be automagicly opened after transfer ? This only applies for
+ * download transfers.
+ *
+ * @param value The setting
+ */
+ void setOpenAfterTransfer(bool value) { m_openAfterTransfer = value; }
+
+ /**
+ * Is this transfer marked for deletion ?
+ *
+ * @return true if this transfer is marked for deletion
+ */
+ bool isDeleteMarked() const { return m_deleteMe; }
+
+ /**
+ * Get the transfer's parent transfer.
+ *
+ * @return Transfer's parent or NULL if isChild() returns false
+ */
+ Transfer *parentTransfer();
+
+ /**
+ * Lock this transfer for further changes.
+ */
+ void lock();
+
+ /**
+ * Unlock a previously locked transfer.
+ */
+ void unlock();
+
+ /**
+ * Abort current transfer.
+ */
+ virtual void abort();
+
+ /**
+ * Just emits the objectUpdated() signal.
+ */
+ void emitUpdate() { emit objectUpdated(); }
+
+ /**
+ * Assign sessions to this transfer in advance (= before starting the
+ * actual transfer). Both sessions must have free connections. If you
+ * pass NULL to both parameters sessions will be looked up and might
+ * be spawned.
+ *
+ * Note that the sessions MUST be the right ones based on the transfer's
+ * URL, otherwise unexpected results will ocurr!
+ *
+ * @param source The source session
+ * @param destination The destination session
+ * @return True if the sessions are ready for immediate use
+ */
+ virtual bool assignSessions(KFTPSession::Session *source = 0, KFTPSession::Session *destination = 0);
+
+ /**
+ * This method returns true if both connections have been properly
+ * initialized.
+ */
+ bool connectionsReady();
+protected:
+ bool m_deleteMe;
+ bool m_openAfterTransfer;
+ TransferType m_transferType;
+
+ /* Source/destination URL */
+ KURL m_sourceUrl;
+ KURL m_destUrl;
+
+ /* Transfer sessions */
+ KFTPSession::Session *m_srcSession;
+ KFTPSession::Session *m_dstSession;
+
+ /* Source/destination connections */
+ KFTPSession::Connection *m_srcConnection;
+ KFTPSession::Connection *m_dstConnection;
+
+ int m_retryCount;
+
+ void showTransCompleteBalloon();
+ void resetTransfer();
+
+ void update();
+ bool canMove();
+
+ /**
+ * This method gets called just before the transfer is removed.
+ *
+ * @param abortSession If true any session that this transfer is using is aborted
+ */
+ void faceDestruction(bool abortSession = true);
+
+ /**
+ * Initialize the specified session for use with this transfer.
+ *
+ * @param session The session to use
+ * @return A valid Connection or NULL if one wasn't available
+ */
+ KFTPSession::Connection *initializeSession(KFTPSession::Session *session);
+
+ /**
+ * Deinitialize currently acquired connections. Do not call this method
+ * unless you know what you are doing.
+ */
+ void deinitializeConnections();
+private slots:
+ void slotConnectionAvailable();
+ void slotConnectionConnected();
+signals:
+ void transferStart(long id);
+ void transferComplete(long id);
+ void transferAbort(long id);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/kftptransferdir.cpp b/kftpgrabber/src/kftptransferdir.cpp
new file mode 100644
index 0000000..c5359c4
--- /dev/null
+++ b/kftpgrabber/src/kftptransferdir.cpp
@@ -0,0 +1,151 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftptransferdir.h"
+#include "kftpqueue.h"
+#include "kftpsession.h"
+#include "queuegroup.h"
+
+#include <kstandarddirs.h>
+
+using namespace KFTPEngine;
+using namespace KFTPSession;
+
+namespace KFTPQueue {
+
+TransferDir::TransferDir(QObject *parent)
+ : Transfer(parent, Transfer::Directory),
+ m_scanned(false),
+ m_group(new QueueGroup(this))
+{
+ // Connect to some group signals
+ connect(m_group, SIGNAL(interrupted()), this, SLOT(slotGroupInterrupted()));
+ connect(m_group, SIGNAL(done()), this, SLOT(slotGroupDone()));
+}
+
+void TransferDir::execute()
+{
+ // Assign sessions if they are missing
+ if (!connectionsReady() && !assignSessions(m_srcSession, m_dstSession))
+ return;
+
+ if ((m_dstConnection && !m_dstConnection->isConnected()) || (m_srcConnection && !m_srcConnection->isConnected())) {
+ // If not yet connected, wait for the connection
+ m_status = Connecting;
+ return;
+ }
+
+ if (!m_scanned && !hasParentTransfer() && m_children.count() == 0) {
+ if (m_srcSession) {
+ m_srcSession->scanDirectory(this, m_srcConnection);
+ m_scanned = true;
+
+ connect(m_srcSession, SIGNAL(dirScanDone()), this, SLOT(slotDirScanDone()));
+ } else {
+ connect(new DirectoryScanner(this), SIGNAL(completed()), this, SLOT(slotDirScanDone()));
+ }
+
+ return;
+ }
+
+ m_status = Running;
+
+ // If the directory is empty, create it anyway
+ if (m_children.count() == 0) {
+ if (m_destUrl.isLocalFile()) {
+ KStandardDirs::makeDir(m_destUrl.path());
+ } else {
+ m_dstSession->getClient()->mkdir(m_destUrl);
+ }
+ }
+
+ // We no longer need the connections, release them
+ deinitializeConnections();
+
+ // Reset and start the group
+ m_group->reset();
+ m_group->executeNextTransfer();
+}
+
+void TransferDir::abort()
+{
+ // If not running, just return
+ if (!isRunning()) return;
+
+ Transfer::abort();
+
+ // Signal abort to all child transfers
+ if (!m_deleteMe) {
+ QueueObject *i;
+
+ for (i = m_children.first(); i; i = m_children.next()) {
+ if (i->isRunning() && !i->isAborting())
+ i->abort();
+ }
+ }
+
+ resetTransfer();
+ update();
+}
+
+void TransferDir::slotGroupDone()
+{
+ // There are no more transfers, so we are finished
+ showTransCompleteBalloon();
+ m_deleteMe = true;
+ resetTransfer();
+
+ emit transferComplete(m_id);
+ KFTPQueue::Manager::self()->doEmitUpdate();
+}
+
+void TransferDir::slotGroupInterrupted()
+{
+ if (!m_aborting)
+ abort();
+}
+
+void TransferDir::slotDirScanDone()
+{
+ if (m_srcSession)
+ disconnect(m_srcSession, SIGNAL(dirScanDone()), this, SLOT(slotDirScanDone()));
+
+ // Reexecute the transfer
+ delayedExecute();
+}
+
+}
+
+#include "kftptransferdir.moc"
diff --git a/kftpgrabber/src/kftptransferdir.h b/kftpgrabber/src/kftptransferdir.h
new file mode 100644
index 0000000..1f0e7ff
--- /dev/null
+++ b/kftpgrabber/src/kftptransferdir.h
@@ -0,0 +1,87 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEKFTPTRANSFERDIR_H
+#define KFTPQUEUEKFTPTRANSFERDIR_H
+
+#include "kftptransfer.h"
+
+namespace KFTPEngine {
+ class Event;
+}
+
+namespace KFTPQueue {
+
+/**
+ * This class represents a queued directory transfer. It can have child transfers that
+ * will be executed one by one, when this transfer is executed.
+ *
+ * @author Jernej Kos
+ */
+class TransferDir : public Transfer
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent object
+ */
+ TransferDir(QObject *parent);
+
+ /**
+ * @overload
+ * Reimplemented from KFTPQueue::Transfer.
+ */
+ void execute();
+
+ /**
+ * @overload
+ * Reimplemented from KFTPQueue::Transfer.
+ */
+ void abort();
+private:
+ bool m_scanned;
+ QueueGroup *m_group;
+private slots:
+ void slotGroupDone();
+ void slotGroupInterrupted();
+
+ void slotDirScanDone();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/kftptransferfile.cpp b/kftpgrabber/src/kftptransferfile.cpp
new file mode 100644
index 0000000..9f49ae5
--- /dev/null
+++ b/kftpgrabber/src/kftptransferfile.cpp
@@ -0,0 +1,413 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftptransferfile.h"
+#include "widgets/systemtray.h"
+#include "kftpsession.h"
+#include "statistics.h"
+
+#include "engine/thread.h"
+
+#include "misc/config.h"
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kio/renamedlg.h>
+#include <kdiskfreesp.h>
+
+#include <qtimer.h>
+#include <qfileinfo.h>
+
+using namespace KFTPEngine;
+using namespace KFTPSession;
+
+namespace KFTPQueue {
+
+TransferFile::TransferFile(QObject *parent)
+ : Transfer(parent, Transfer::File),
+ m_updateTimer(0),
+ m_dfTimer(0)
+{
+}
+
+bool TransferFile::assignSessions(Session *source, Session *destination)
+{
+ if (!Transfer::assignSessions(source, destination))
+ return false;
+
+ // Connect signals
+ if (m_srcConnection) {
+ connect(m_srcConnection->getClient()->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+ connect(m_srcConnection, SIGNAL(aborting()), this, SLOT(slotSessionAborting()));
+ connect(m_srcConnection, SIGNAL(connectionLost(KFTPSession::Connection*)), this, SLOT(slotConnectionLost(KFTPSession::Connection*)));
+ }
+
+ if (m_dstConnection) {
+ connect(m_dstConnection->getClient()->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+ connect(m_dstConnection, SIGNAL(aborting()), this, SLOT(slotSessionAborting()));
+ connect(m_dstConnection, SIGNAL(connectionLost(KFTPSession::Connection*)), this, SLOT(slotConnectionLost(KFTPSession::Connection*)));
+ }
+
+ return true;
+}
+
+void TransferFile::execute()
+{
+ // Failed transfers aren't allowed to be executed until they are readded to
+ // the queue and the Failed status is changed to Stopped.
+ if (getStatus() == Failed)
+ return;
+
+ // Assign sessions if they are missing
+ if (!connectionsReady() && !assignSessions(m_srcSession, m_dstSession))
+ return;
+
+ if ((m_dstConnection && !m_dstConnection->isConnected()) || (m_srcConnection && !m_srcConnection->isConnected())) {
+ m_status = Connecting;
+ return;
+ }
+
+ // We are running now
+ m_status = Running;
+
+ m_completed = 0;
+ m_resumed = 0;
+
+ // Init timer to follow the update
+ if (!m_updateTimer) {
+ m_updateTimer = new QTimer(this);
+ connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(slotTimerUpdate()));
+ m_updateTimer->start(1000);
+ }
+
+ // Should we check for free space ?
+ if (KFTPCore::Config::diskCheckSpace() && !m_dfTimer) {
+ m_dfTimer = new QTimer(this);
+ connect(m_dfTimer, SIGNAL(timeout()), this, SLOT(slotTimerDiskFree()));
+ m_dfTimer->start(KFTPCore::Config::diskCheckInterval() * 1000);
+ }
+
+ emit transferStart(m_id);
+
+ switch(m_transferType) {
+ case Download: {
+ m_srcConnection->getClient()->get(m_sourceUrl, m_destUrl);
+ break;
+ }
+ case Upload: {
+ m_dstConnection->getClient()->put(m_sourceUrl, m_destUrl);
+ break;
+ }
+ case FXP: {
+ // Start the timer to extrapolate transfer rate
+ m_elapsedTime.start();
+ m_srcConnection->getClient()->siteToSite(m_dstConnection->getClient(), m_sourceUrl, m_destUrl);
+ break;
+ }
+ }
+}
+
+void TransferFile::slotConnectionLost(KFTPSession::Connection *connection)
+{
+ if (!isRunning())
+ return;
+
+ if (m_status != Connecting) {
+ // Semi-reset the current transfer
+ addCompleted(-m_completed);
+
+ m_resumed = 0;
+ m_completed = 0;
+ m_aborting = false;
+ m_size = m_actualSize;
+
+ setSpeed(0);
+
+ // Wait for the connection to come
+ m_status = Connecting;
+ connection->reconnect();
+ } else
+ connection->reconnect();
+}
+
+void TransferFile::slotEngineEvent(KFTPEngine::Event *event)
+{
+ if (!isRunning())
+ return;
+
+ switch (event->type()) {
+ case Event::EventTransferComplete: {
+ // ***************************************************************************
+ // ************************ EventTransferComplete ****************************
+ // ***************************************************************************
+ // Calculate transfer rate for last transfer, and save to site's statistics
+ if (getTransferType() == FXP) {
+ if (m_elapsedTime.elapsed() > 10000) {
+ double speed = (m_size - m_resumed) / (double) m_elapsedTime.elapsed();
+ Statistics::self()->getSite(m_sourceUrl)->setLastFxpSpeed(speed * 1024);
+ }
+ }
+
+ // Update the completed size if the transfer was faster than the update timer
+ addCompleted(m_size - m_completed);
+
+ m_updateTimer->stop();
+ m_updateTimer->QObject::disconnect();
+
+ if (m_openAfterTransfer && m_transferType == Download) {
+ // Set status to stopped, so the view gets reloaded
+ m_status = Stopped;
+
+ Manager::self()->openAfterTransfer(this);
+ } else {
+ showTransCompleteBalloon();
+ }
+
+ m_deleteMe = true;
+ addActualSize(-m_size);
+
+ resetTransfer();
+ emit transferComplete(m_id);
+
+ KFTPQueue::Manager::self()->doEmitUpdate();
+ break;
+ }
+ case Event::EventResumeOffset: {
+ // ***************************************************************************
+ // ************************** EventResumeOffset ******************************
+ // ***************************************************************************
+ m_resumed = event->getParameter(0).asFileSize();
+ addCompleted(m_resumed);
+ break;
+ }
+ case Event::EventError: {
+ // ***************************************************************************
+ // ****************************** EventError *********************************
+ // ***************************************************************************
+ ErrorCode error = event->getParameter(0).asErrorCode();
+
+ switch (error) {
+ case ConnectFailed: {
+ FailedTransfer::fail(this, i18n("Connection to the server has failed."));
+ break;
+ }
+ case LoginFailed: {
+ FailedTransfer::fail(this, i18n("Login to the server has failed"));
+ break;
+ }
+ case FileNotFound: {
+ FailedTransfer::fail(this, i18n("Source file cannot be found."));
+ break;
+ }
+ case PermissionDenied: {
+ FailedTransfer::fail(this, i18n("Permission was denied."));
+ break;
+ }
+ case FileOpenFailed: {
+ FailedTransfer::fail(this, i18n("Unable to open local file for read or write operations."));
+ break;
+ }
+ case OperationFailed: {
+ FailedTransfer::fail(this, i18n("Transfer failed for some reason."));
+ break;
+ }
+ default: break;
+ }
+
+ break;
+ }
+ case Event::EventFileExists: {
+ // ***************************************************************************
+ // *************************** EventFileExists *******************************
+ // ***************************************************************************
+ DirectoryListing list = event->getParameter(0).asDirectoryListing();
+ FileExistsWakeupEvent *event = Manager::self()->fileExistsAction(this, list.list());
+
+ if (event)
+ remoteConnection()->getClient()->wakeup(event);
+ break;
+ }
+ default: break;
+ }
+}
+
+void TransferFile::wakeup(KFTPEngine::FileExistsWakeupEvent *event)
+{
+ if (event)
+ remoteConnection()->getClient()->wakeup(event);
+}
+
+void TransferFile::slotTimerUpdate()
+{
+ // Update the current stats
+ if (!m_srcSession && !m_dstSession) {
+ m_updateTimer->stop();
+ m_updateTimer->QObject::disconnect();
+ return;
+ }
+
+ if (m_status == Running) {
+ // Get speed from connection, or use FXP extrapolation.
+ if (getTransferType() == FXP) {
+ double lastFxpSpeed = Statistics::self()->getSite(m_sourceUrl)->lastFxpSpeed();
+
+ if (lastFxpSpeed != 0.0) {
+ setSpeed(lastFxpSpeed);
+
+ if (m_completed < m_size)
+ addCompleted(getSpeed());
+ }
+ } else {
+ if (remoteConnection()->getClient()->socket()->getTransferBytes() > m_completed - m_resumed)
+ addCompleted(remoteConnection()->getClient()->socket()->getTransferBytes() - (m_completed - m_resumed));
+
+ setSpeed(remoteConnection()->getClient()->socket()->getTransferSpeed());
+ }
+ }
+
+ update();
+}
+
+void TransferFile::slotTimerDiskFree()
+{
+ // Check for disk usage
+ if (KFTPCore::Config::diskCheckSpace()) {
+ KDiskFreeSp *df = KDiskFreeSp::findUsageInfo((getDestUrl().path()));
+ connect(df, SIGNAL(foundMountPoint(const QString&, unsigned long, unsigned long, unsigned long)), this, SLOT(slotDiskFree(const QString&, unsigned long, unsigned long, unsigned long)));
+ }
+}
+
+void TransferFile::slotDiskFree(const QString &mountPoint, unsigned long, unsigned long, unsigned long kBAvail)
+{
+ if (KFTPCore::Config::diskCheckSpace()) {
+ // Is there enough free space ?
+ if (kBAvail < (unsigned long) KFTPCore::Config::diskMinFreeSpace()) {
+ QString transAbortStr = i18n("Transfer of the following files <b>has been aborted</b> because there is not enough free space left on '%1':").arg(mountPoint);
+ transAbortStr += "<br><i>";
+ transAbortStr += getSourceUrl().fileName();
+ transAbortStr += "</i>";
+ KFTPWidgets::SystemTray::self()->showBalloon(transAbortStr);
+
+ // Abort the transfer
+ abort();
+ }
+ }
+}
+
+void TransferFile::resetTransfer()
+{
+ // Unlock the sessions (they should be unlocked automaticly when the transferComplete signal
+ // is emitted, but when a transfer is a child transfer, the next transfer may need the session
+ // sooner). Also sessions should be unlocked when transfer aborts.
+ if (getStatus() != Waiting) {
+ // Disconnect signals
+ if (m_srcConnection) {
+ m_srcConnection->getClient()->eventHandler()->QObject::disconnect(this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+ m_srcConnection->QObject::disconnect(this, SLOT(slotSessionAborting()));
+ m_srcConnection->QObject::disconnect(this, SLOT(slotConnectionLost(KFTPSession::Connection*)));
+
+ m_srcConnection->remove();
+ }
+
+ if (m_dstConnection) {
+ m_dstConnection->getClient()->eventHandler()->QObject::disconnect(this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+ m_dstConnection->QObject::disconnect(this, SLOT(slotSessionAborting()));
+ m_dstConnection->QObject::disconnect(this, SLOT(slotConnectionLost(KFTPSession::Connection*)));
+
+ m_dstConnection->remove();
+ }
+ }
+
+ Transfer::resetTransfer();
+}
+
+void TransferFile::slotSessionAborting()
+{
+ if (!m_aborting)
+ abort();
+}
+
+void TransferFile::abort()
+{
+ if (!isRunning())
+ return;
+
+ Transfer::abort();
+
+ if (getStatus() == Waiting) {
+ if (m_srcSession)
+ m_srcSession->QObject::disconnect(this, SLOT(slotConnectionAvailable()));
+
+ if (m_dstSession)
+ m_dstSession->QObject::disconnect(this, SLOT(slotConnectionAvailable()));
+ }
+
+ if (m_updateTimer) {
+ m_updateTimer->stop();
+ m_updateTimer->QObject::disconnect();
+
+ delete m_updateTimer;
+ m_updateTimer = 0L;
+ }
+
+ if (m_dfTimer) {
+ m_dfTimer->stop();
+ m_dfTimer->QObject::disconnect();
+
+ delete m_dfTimer;
+ m_dfTimer = 0L;
+ }
+
+ // Abort any transfers
+ if (m_srcConnection)
+ m_srcConnection->abort();
+
+ if (m_dstConnection)
+ m_dstConnection->abort();
+
+ // Update everything
+ resetTransfer();
+
+ if (!hasParentTransfer())
+ update();
+
+ if (hasParentObject() && parentObject()->isAborting())
+ disconnect(parent());
+}
+
+}
+
+
+#include "kftptransferfile.moc"
diff --git a/kftpgrabber/src/kftptransferfile.h b/kftpgrabber/src/kftptransferfile.h
new file mode 100644
index 0000000..da47339
--- /dev/null
+++ b/kftpgrabber/src/kftptransferfile.h
@@ -0,0 +1,127 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEKFTPTRANSFERFILE_H
+#define KFTPQUEUEKFTPTRANSFERFILE_H
+
+#include <qdatetime.h>
+
+#include "kftptransfer.h"
+
+namespace KFTPSession {
+ class Connection;
+}
+
+namespace KFTPEngine {
+ class Event;
+ class FileExistsWakeupEvent;
+}
+
+namespace KFTPQueue {
+
+/**
+ * This class represents a queued file transfer.
+ *
+ * @author Jernej Kos
+ */
+class TransferFile : public Transfer
+{
+Q_OBJECT
+friend class Manager;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent object
+ */
+ TransferFile(QObject *parent);
+
+ /**
+ * Wakes this transfer up after the action for the file exists situation
+ * has been decided. The event is simply relayed to the underlying socket.
+ *
+ * @param event Event instance or 0 if nothing should be delivered
+ */
+ void wakeup(KFTPEngine::FileExistsWakeupEvent *event);
+
+ /**
+ * @overload
+ * Reimplemented from KFTPQueue::QueueObject.
+ */
+ void execute();
+
+ /**
+ * @overload
+ * Reimplemented from KFTPQueue::Transfer.
+ */
+ void abort();
+
+ /**
+ * @overload
+ * Reimplemented from KFTPQueue::Transfer.
+ *
+ * @param source The source session
+ * @param destination The destination session
+ * @return True if the sessions are ready for immediate use
+ */
+ bool assignSessions(KFTPSession::Session *source = 0, KFTPSession::Session *destination = 0);
+private:
+ /* Update timers */
+ QTimer *m_updateTimer;
+ QTimer *m_dfTimer;
+
+ /* FXP */
+ QTime m_elapsedTime;
+
+ /**
+ * @overload
+ * Reimplemented from KFTPQueue::Transfer.
+ */
+ void resetTransfer();
+private slots:
+ void slotTimerUpdate();
+ void slotTimerDiskFree();
+
+ void slotDiskFree(const QString &mountPoint, unsigned long kBSize, unsigned long kBUsed, unsigned long kBAvail);
+
+ void slotEngineEvent(KFTPEngine::Event *event);
+ void slotSessionAborting();
+
+ void slotConnectionLost(KFTPSession::Connection *connection);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/main.cpp b/kftpgrabber/src/main.cpp
new file mode 100644
index 0000000..ea7482b
--- /dev/null
+++ b/kftpgrabber/src/main.cpp
@@ -0,0 +1,137 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "mainwindow.h"
+#include "misc/config.h"
+
+#include <kuniqueapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <ksplashscreen.h>
+
+#include "kftpsession.h"
+
+static const char description[] =
+ I18N_NOOP("KFTPGrabber - an FTP client for KDE");
+
+static const char version[] = "0.8.1";
+
+static KCmdLineOptions options[] =
+{
+ { "+[url]", I18N_NOOP("An optional URL to connect to"), 0},
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ KAboutData about("kftpgrabber", I18N_NOOP("KFTPGrabber"), version, description,
+ KAboutData::License_GPL, "(C) 2007, The KFTPGrabber developers", 0, "http://www.kftp.org");
+ about.addAuthor("Jernej Kos", I18N_NOOP("Lead developer"), "kostko@unimatrix-one.org");
+ about.addAuthor("Markus Brüffer", I18N_NOOP("Developer"), "markus@brueffer.de");
+
+ about.addCredit("Aris Adamantiadis", I18N_NOOP("LibSSH code"), "aris@0xbadc0de.be");
+ about.addCredit("Anthony D. Urso", I18N_NOOP("otpCalc code"));
+ about.addCredit("Kopete Developers", I18N_NOOP("KopeteBalloon popup code"), "kopete-devel@kde.org");
+ about.addCredit("KSysGuard Developers", I18N_NOOP("Traffic graph widget"), "cs@kde.org");
+ about.addCredit("Bob Ziuchkovski", I18N_NOOP("Icon design"), "ziuchkov@uiuc.edu");
+ about.addCredit("Tobias Ussing", I18N_NOOP("Testing and debugging"), "thehole@mail.seriesdb.com");
+ about.addCredit("Lee Joseph", I18N_NOOP("Testing and debugging"), "cyberspy1@hotmail.com");
+ about.addCredit("Tim Kosse", I18N_NOOP("Directory parser code"), "tim.kosse@gmx.de");
+ about.addCredit("Peter Penz", I18N_NOOP("Listview column handling code"), "peter.penz@gmx.at");
+
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KUniqueApplication app;
+
+ if (app.isRestored()) {
+ RESTORE(MainWindow);
+ } else {
+ MainWindow *mainWindow = 0;
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ KSplashScreen *splash = 0L;
+ QString splashPath = locate("appdata", "kftpgrabber-logo.png");
+ if (!KFTPCore::Config::startMinimized() && KFTPCore::Config::showSplash()) {
+ // Show the splash screen
+ if (!splashPath.isNull()) {
+ QPixmap splashImage = QPixmap(splashPath);
+ splash = new KSplashScreen(splashImage);
+ splash->setMaximumWidth(400);
+ splash->show();
+ }
+ }
+
+ mainWindow = new MainWindow();
+ app.setMainWidget(mainWindow);
+
+ if (!KFTPCore::Config::startMinimized())
+ mainWindow->show();
+
+ // Check if an URL was passed as a command line argument
+ if (args->count() == 1) {
+ KURL remoteUrl = args->url(0);
+
+ if (!remoteUrl.isLocalFile()) {
+ if (!remoteUrl.port())
+ remoteUrl.setPort(21);
+
+ if (!remoteUrl.hasUser())
+ remoteUrl.setUser("anonymous");
+
+ if (!remoteUrl.hasPass()) {
+ if (!KFTPCore::Config::anonMail().isEmpty())
+ remoteUrl.setPass(KFTPCore::Config::anonMail());
+ else
+ remoteUrl.setPass("userlogin@anonymo.us");
+ }
+
+ KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, remoteUrl);
+ }
+ }
+
+ if (splash != 0L) {
+ splash->finish(mainWindow);
+ delete splash;
+ }
+
+ args->clear();
+ }
+
+ return app.exec();
+}
+
diff --git a/kftpgrabber/src/mainactions.cpp b/kftpgrabber/src/mainactions.cpp
new file mode 100644
index 0000000..d694ab1
--- /dev/null
+++ b/kftpgrabber/src/mainactions.cpp
@@ -0,0 +1,189 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "mainactions.h"
+#include <config.h>
+
+#include "misc.h"
+#include "kftpapi.h"
+#include "kftpqueue.h"
+#include "kftpbookmarks.h"
+#include "configdialog.h"
+#include "kftpsession.h"
+
+#include "widgets/browser/view.h"
+#include "widgets/browser/detailsview.h"
+#include "widgets/browser/propsplugin.h"
+
+#include "misc/config.h"
+#include "misc/filter.h"
+
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kaboutapplication.h>
+#include <kkeydialog.h>
+#include <kedittoolbar.h>
+#include <kpropertiesdialog.h>
+#include <kio/job.h>
+#include <kshred.h>
+#include <klineedit.h>
+
+#include <qclipboard.h>
+
+using namespace KFTPGrabberBase;
+using namespace KFTPWidgets::Browser;
+using namespace KFTPCore::Filter;
+
+MainActions::MainActions(MainWindow *parent)
+ : QObject(parent),
+ m_configDialog(0),
+ m_closeApp(false)
+{
+ // setup File menu
+ m_fileConnectAction = new KAction(i18n("Quick &Connect..."), "connect_creating", KShortcut(), mainWidget(), SLOT(slotQuickConnect()), actionCollection(), "file_quick_connect");
+ m_newSessionAction = new KActionMenu(i18n("&New Session"), "filenew", actionCollection(), "file_newsession");
+
+ KAction *leftSide = new KAction(i18n("&Left Side"), KShortcut(), this, SLOT(slotNewSessionLeft()), actionCollection());
+ KAction *rightSide = new KAction(i18n("&Right Side"), KShortcut(), this, SLOT(slotNewSessionRight()), actionCollection());
+ m_newSessionAction->insert(leftSide);
+ m_newSessionAction->insert(rightSide);
+ m_newSessionAction->setStickyMenu(true);
+ m_newSessionAction->setDelayed(false);
+ KStdAction::quit(this, SLOT(slotFileQuit()), actionCollection());
+
+ // setup Settings menu
+ //KStdAction::configureToolbars(this, SLOT(slotConfigureToolbars()), actionCollection());
+ //KStdAction::keyBindings(this, SLOT(slotKeyBindings()), actionCollection());
+ KStdAction::saveOptions(this, SLOT(slotSettingsSave()), actionCollection());
+ KStdAction::preferences(this, SLOT(slotSettingsConfig()), actionCollection());
+ mainWidget()->createStandardStatusBarAction();
+ mainWidget()->setStandardToolBarMenuEnabled(true);
+
+ // setup transfermode actions
+ m_transModeAction = new KActionMenu(i18n("&Transfer Mode (Auto)"), "binary", actionCollection(), "transfermode");
+ m_modeAscii = new KRadioAction(i18n("ASCII"), "ascii", KShortcut(), this, SLOT(slotModeAscii()), actionCollection());
+ m_modeBinary = new KRadioAction(i18n("Binary"), "binary", KShortcut(), this, SLOT(slotModeBinary()), actionCollection());
+ m_modeAuto = new KRadioAction(i18n("Auto"), KShortcut(), this, SLOT(slotModeAuto()), actionCollection());
+
+ // Set grouping so only one action can be selected
+ m_modeAscii->setExclusiveGroup("Transfer mode");
+ m_modeBinary->setExclusiveGroup("Transfer mode");
+ m_modeAuto->setExclusiveGroup("Transfer mode");
+
+ // Insert the actions into the menu
+ m_transModeAction->insert(m_modeAscii);
+ m_transModeAction->insert(m_modeBinary);
+ m_transModeAction->popupMenu()->insertSeparator();
+ m_transModeAction->insert(m_modeAuto);
+ m_transModeAction->setStickyMenu(true);
+ m_transModeAction->setDelayed(false);
+}
+
+KActionCollection *MainActions::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+KMainWindow *MainActions::mainWidget()
+{
+ return KFTPAPI::getInstance()->mainWindow();
+}
+
+void MainActions::slotModeAscii()
+{
+ m_transModeAction->setIcon("ascii");
+ m_transModeAction->setText(i18n("&Transfer Mode (ASCII)"));
+ KFTPCore::Config::self()->setGlobalMode('A');
+}
+
+void MainActions::slotModeBinary()
+{
+ m_transModeAction->setIcon("binary");
+ m_transModeAction->setText(i18n("&Transfer Mode (Binary)"));
+ KFTPCore::Config::self()->setGlobalMode('I');
+}
+
+void MainActions::slotModeAuto()
+{
+ m_transModeAction->setText(i18n("&Transfer Mode (Auto)"));
+ KFTPCore::Config::self()->setGlobalMode('X');
+}
+
+void MainActions::slotFileQuit()
+{
+ m_closeApp = true;
+ mainWidget()->close();
+}
+
+void MainActions::slotSettingsSave()
+{
+ KFTPCore::Config::self()->saveConfig();
+}
+
+void MainActions::slotSettingsConfig()
+{
+ if (!m_configDialog)
+ m_configDialog = new KFTPWidgets::ConfigDialog(mainWidget());
+
+ m_configDialog->prepareDialog();
+ m_configDialog->exec();
+}
+
+void MainActions::slotNewSessionLeft()
+{
+ KFTPSession::Manager::self()->spawnLocalSession(KFTPSession::LeftSide, true);
+}
+
+void MainActions::slotNewSessionRight()
+{
+ KFTPSession::Manager::self()->spawnLocalSession(KFTPSession::RightSide, true);
+}
+
+void MainActions::slotKeyBindings()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void MainActions::slotConfigureToolbars()
+{
+ KEditToolbar dlg(actionCollection());
+
+ if (dlg.exec())
+ mainWidget()->createGUI();
+}
+
+#include "mainactions.moc"
diff --git a/kftpgrabber/src/mainactions.h b/kftpgrabber/src/mainactions.h
new file mode 100644
index 0000000..908f1ce
--- /dev/null
+++ b/kftpgrabber/src/mainactions.h
@@ -0,0 +1,115 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef MAINACTIONS_H
+#define MAINACTIONS_H
+
+#include <qobject.h>
+#include <kaction.h>
+
+class MainWindow;
+class KMainWindow;
+
+namespace KFTPWidgets {
+ class SystemTray;
+ class ConfigDialog;
+}
+
+/**
+ * This class contains the actions that are used in the main window,
+ * it's toolbars and in the menu bar.
+ *
+ * @author Jernej Kos
+ */
+class MainActions : public QObject
+{
+Q_OBJECT
+friend class MainWindow;
+friend class KFTPWidgets::SystemTray;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The main window instance
+ */
+ MainActions(MainWindow *parent);
+private:
+ // File menu
+ KAction *m_fileConnectAction;
+ KActionMenu *m_newSessionAction;
+
+ // Edit menu
+ KAction *m_renameAction;
+ KAction *m_deleteAction;
+ KAction *m_propsAction;
+ KAction *m_shredAction;
+
+ KAction *m_copyAction;
+ KAction *m_pasteAction;
+
+ KActionMenu *m_filterActions;
+ KAction *m_alwaysSkipAction;
+ KAction *m_topPriorityAction;
+ KAction *m_lowPriorityAction;
+
+ // Other
+ KActionMenu *m_transModeAction;
+ KRadioAction *m_modeAscii;
+ KRadioAction *m_modeBinary;
+ KRadioAction *m_modeAuto;
+
+ KFTPWidgets::ConfigDialog *m_configDialog;
+ KActionCollection *actionCollection();
+ KMainWindow *mainWidget();
+
+ bool m_closeApp;
+public slots:
+ void slotFileQuit();
+
+ void slotNewSessionLeft();
+ void slotNewSessionRight();
+
+ void slotConfigureToolbars();
+ void slotKeyBindings();
+ void slotSettingsSave();
+ void slotSettingsConfig();
+
+ void slotModeAscii();
+ void slotModeBinary();
+ void slotModeAuto();
+};
+
+#endif
diff --git a/kftpgrabber/src/mainwindow.cpp b/kftpgrabber/src/mainwindow.cpp
new file mode 100644
index 0000000..b77f0ea
--- /dev/null
+++ b/kftpgrabber/src/mainwindow.cpp
@@ -0,0 +1,447 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qtextedit.h>
+#include <qtabwidget.h>
+#include <qhbox.h>
+#include <qvbox.h>
+#include <qthread.h>
+
+#include <kapplication.h>
+#include <kmdimainfrm.h>
+#include <kmdichildview.h>
+#include <kmenubar.h>
+#include <kpopupmenu.h>
+#include <ktoolbar.h>
+#include <kiconloader.h>
+#include <kdialogbase.h>
+#include <kfiledetailview.h>
+#include <kmessagebox.h>
+#include <klineeditdlg.h>
+#include <kstatusbar.h>
+#include <klocale.h>
+#include <kio/job.h>
+#include <kpassdlg.h>
+#include <ksslpkcs12.h>
+#include <kstandarddirs.h>
+
+#include "misc.h"
+#include "kftpapi.h"
+
+// Widgets
+#include "widgets/systemtray.h"
+#include "bookmarks/sidebar.h"
+#include "bookmarks/editor.h"
+#include "bookmarks/listview.h"
+#include "logview.h"
+#include "queueview/queueview.h"
+#include "queueview/threadview.h"
+#include "widgets/quickconnect.h"
+#include "kftpserverlineedit.h"
+#include "browser/view.h"
+#include "kftpzeroconflistview.h"
+#include "trafficgraph.h"
+#include "kftptabwidget.h"
+#include "failedtransfers.h"
+
+#include "sidebar.h"
+
+// Other KFTPGrabber stuff
+#include "misc/config.h"
+#include "misc/customcommands/manager.h"
+
+#include "mainwindow.h"
+#include "mainactions.h"
+#include "kftpbookmarks.h"
+#include "kftpqueue.h"
+#include "kftpsession.h"
+#include "kftpqueueconverter.h"
+#include "kftppluginmanager.h"
+#include "engine/thread.h"
+
+using namespace KFTPGrabberBase;
+
+MainWindow::MainWindow()
+ : KMainWindow()
+{
+ // Init the API
+ KFTPAPI::getInstance()->m_mainWindow = this;
+
+ // Set the shell's ui resource file
+ setXMLFile("kftpgrabberui.rc");
+ connect(KApplication::kApplication(), SIGNAL(shutDown()), this, SLOT(appShutdown()));
+
+ // Restore size and position
+ resize(KFTPCore::Config::size());
+ move(KFTPCore::Config::position());
+ setCaption("KFTPGrabber");
+
+ KFTPCore::Config::self()->postInit();
+
+ // Load plugins
+ KFTPAPI::getInstance()->pluginManager()->loadPlugins();
+
+ // Load custom commands
+ KFTPCore::CustomCommands::Manager::self()->load();
+
+ connect(KFTPQueue::Manager::self(), SIGNAL(queueUpdate()), this, SLOT(slotUpdateStatusBar()));
+ connect(KFTPBookmarks::Manager::self(), SIGNAL(update()), this, SLOT(initBookmarkMenu()));
+ connect(KFTPCore::Config::self(), SIGNAL(configChanged()), this, SLOT(slotConfigChanged()));
+
+ m_trafficGraph = 0L;
+ m_bookmarkMenu = 0L;
+ m_zeroconfMenu = 0L;
+ m_walletMenu = 0L;
+
+ // Init the gui system
+ initTrafficGraph();
+ initMainView();
+ initStatusBar();
+ initBookmarkMenu();
+
+ // Create the actions object
+ m_actions = new MainActions(this);
+
+ // Create the systray icon
+ new KFTPWidgets::SystemTray(this);
+
+ // Create base two sessions
+ KFTPSession::Manager::self()->spawnLocalSession(KFTPSession::LeftSide);
+ KFTPSession::Manager::self()->spawnLocalSession(KFTPSession::RightSide);
+
+ // Load bookmarks
+ QTimer::singleShot(500, this, SLOT(slotReadBookmarks()));
+
+ // Check for the uirc file
+ if (KGlobal::dirs()->findResource("appdata", xmlFile()) == QString::null) {
+ KMessageBox::error(0, i18n("<qt>Unable to find %1 XML GUI descriptor file. Please check that you have installed the application correctly! If you have any questions please ask on %2.<br><br><b>Warning:</b> Current GUI will be incomplete!</qt>").arg(xmlFile()).arg("irc.freenode.net/#kftpgrabber"));
+ }
+
+ createGUI(0);
+
+ // Auto-save toolbar/menubar/statusbar settings
+ setAutoSaveSettings(QString::fromLatin1("MainWindow"), false);
+}
+
+void MainWindow::slotReadBookmarks()
+{
+ // Load bookmarks and custom site commands
+ KFTPBookmarks::Manager::self()->load(getStoreDir("bookmarks.xml"));
+
+ // Load the saved queue
+ KFTPQueue::Manager::self()->getConverter()->importQueue(getStoreDir("queue"));
+
+ // Update the bookmark menu
+ initBookmarkMenu();
+}
+
+void MainWindow::appShutdown()
+{
+ KFTPQueue::Manager::self()->stopAllTransfers();
+ KFTPSession::Manager::self()->disconnectAllSessions();
+
+ // Save the queueview layout
+ m_queueView->saveLayout();
+
+ // Save the config data on shutdown
+ KFTPCore::Config::self()->saveConfig();
+
+ // Save current queue
+ KFTPQueue::Manager::self()->getConverter()->exportQueue(getStoreDir("queue"));
+}
+
+bool MainWindow::queryClose()
+{
+ if(KApplication::kApplication()->sessionSaving()) {
+ m_actions->m_closeApp = true;
+ }
+
+ if (!KFTPCore::Config::exitOnClose() && KFTPCore::Config::showSystrayIcon() && !m_actions->m_closeApp) {
+ /*
+ * This code was adopted from the Konversation project
+ * copyright: (C) 2003 by Dario Abatianni, Peter Simonsson
+ * email: eisfuchs@tigress.com, psn@linux.se
+ */
+
+ // Compute size and position of the pixmap to be grabbed:
+ QPoint g = KFTPWidgets::SystemTray::self()->mapToGlobal(KFTPWidgets::SystemTray::self()->pos());
+ int desktopWidth = kapp->desktop()->width();
+ int desktopHeight = kapp->desktop()->height();
+ int tw = KFTPWidgets::SystemTray::self()->width();
+ int th = KFTPWidgets::SystemTray::self()->height();
+ int w = desktopWidth / 4;
+ int h = desktopHeight / 9;
+ int x = g.x() + tw/2 - w/2; // Center the rectange in the systray icon
+ int y = g.y() + th/2 - h/2;
+ if ( x < 0 ) x = 0; // Move the rectangle to stay in the desktop limits
+ if ( y < 0 ) y = 0;
+ if ( x + w > desktopWidth ) x = desktopWidth - w;
+ if ( y + h > desktopHeight ) y = desktopHeight - h;
+
+ // Grab the desktop and draw a circle arround the icon:
+ QPixmap shot = QPixmap::grabWindow( qt_xrootwin(), x, y, w, h );
+ QPainter painter( &shot );
+ const int MARGINS = 6;
+ const int WIDTH = 3;
+ int ax = g.x() - x - MARGINS -1;
+ int ay = g.y() - y - MARGINS -1;
+ painter.setPen( QPen( Qt::red, WIDTH ) );
+ painter.drawArc( ax, ay, tw + 2*MARGINS, th + 2*MARGINS, 0, 16*360 );
+ painter.end();
+
+ // Associate source to image and show the dialog:
+ QMimeSourceFactory::defaultFactory()->setPixmap( "systray_shot", shot );
+ KMessageBox::information( this,
+ i18n( "<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+ "Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+ "<p><center><img source=\"systray_shot\"></center></p>" ),
+ i18n( "Docking in System Tray" ), "HideMenuBarWarning" );
+ hide();
+
+ return false;
+ }
+
+ if (KFTPCore::Config::confirmExit() && KFTPQueue::Manager::self()->getNumRunning() > 0) {
+ if (KMessageBox::questionYesNo(0, i18n("There is currently a transfer running.",
+ "There are currently %n transfers running.",
+ KFTPQueue::Manager::self()->getNumRunning()) + i18n("\nAre you sure you want to quit?"),
+ i18n("Quit")) == KMessageBox::No)
+ {
+ return false;
+ }
+ }
+
+ // Save XML bookmarks here, because the user may be prompted for an encryption password
+ KFTPBookmarks::Manager::self()->save();
+
+ return true;
+}
+
+MainWindow::~MainWindow()
+{
+ delete m_bookmarkMenu;
+ delete m_zeroconfMenu;
+ delete m_walletMenu;
+}
+
+void MainWindow::initTrafficGraph()
+{
+ // Setup traffic graph
+ m_graphTimer = new QTimer(this);
+ connect(m_graphTimer, SIGNAL(timeout()), this, SLOT(slotUpdateTrafficGraph()));
+ m_graphTimer->start(1000);
+
+ // Create and configure the traffic graph
+ m_trafficGraph = new KFTPWidgets::TrafficGraph(0, "graph");
+ m_trafficGraph->setShowLabels(true);
+
+ m_trafficGraph->addBeam(QColor(255, 0, 0));
+ m_trafficGraph->addBeam(QColor(0, 0, 255));
+
+ m_trafficGraph->repaint();
+}
+
+void MainWindow::showBookmarkEditor()
+{
+ KFTPWidgets::Bookmarks::BookmarkEditor *bookmarkEditor = new KFTPWidgets::Bookmarks::BookmarkEditor(this, "bookmark editor");
+ bookmarkEditor->exec();
+ delete bookmarkEditor;
+
+ // Update the bookmarks globaly
+ KFTPBookmarks::Manager::self()->emitUpdate();
+}
+
+void MainWindow::initBookmarkMenu()
+{
+ // Bookmarks menu
+ if (!m_bookmarkMenu)
+ m_bookmarkMenu = new KActionMenu(i18n("Bookmarks"), 0, actionCollection(), "bookmarks");
+ else
+ m_bookmarkMenu->popupMenu()->clear();
+
+ // Zeroconf menu
+ if (!m_zeroconfMenu)
+ m_zeroconfMenu = new KActionMenu(i18n("FTP Sites Near Me"));
+
+ // Wallet menu
+ if (!m_walletMenu)
+ m_walletMenu = new KActionMenu(i18n("Sites In KWallet"), loadSmallIcon("wallet_open"));
+
+ m_bookmarkMenu->popupMenu()->insertItem(loadSmallIcon("bookmark"), i18n("Edit Bookmarks..."), 1);
+ m_bookmarkMenu->popupMenu()->connectItem(1, this, SLOT(showBookmarkEditor()));
+ m_bookmarkMenu->insert(m_zeroconfMenu);
+
+ if (KFTPCore::Config::showWalletSites())
+ m_bookmarkMenu->insert(m_walletMenu);
+
+ m_bookmarkMenu->popupMenu()->insertSeparator();
+
+ // Populate the bookmarks and zeroconf menus
+ KFTPBookmarks::Manager::self()->guiPopulateBookmarksMenu(m_bookmarkMenu);
+ KFTPBookmarks::Manager::self()->guiPopulateZeroconfMenu(m_zeroconfMenu);
+
+ if (KFTPCore::Config::showWalletSites())
+ KFTPBookmarks::Manager::self()->guiPopulateWalletMenu(m_walletMenu);
+}
+
+void MainWindow::initStatusBar()
+{
+ statusBar()->insertItem(i18n("idle"), 1, 1);
+ statusBar()->setItemAlignment(1, Qt::AlignLeft);
+
+ statusBar()->insertItem(i18n("Download: %1/s").arg(KIO::convertSize(KFTPQueue::Manager::self()->getDownloadSpeed())), 2);
+ statusBar()->insertItem(i18n("Upload: %1/s").arg(KIO::convertSize(KFTPQueue::Manager::self()->getUploadSpeed())), 3);
+}
+
+void MainWindow::initSidebars()
+{
+ // BEGIN bottom
+ m_bottomSidebar = new KFTPWidgets::Sidebar(centralWidget(), KFTPWidgets::Sidebar::Bottom);
+
+ // Create the queue
+ m_queueView = new KFTPWidgets::QueueView(0, "queue");
+
+ // Create the failed transfers view
+ KFTPWidgets::FailedTransfers *failedTransfers = new KFTPWidgets::FailedTransfers(0, "failedtransfers");
+
+ m_bottomSidebar->addSidebar(m_queueView, i18n("Queue"), "document");
+ m_bottomSidebar->addSidebar(failedTransfers, i18n("Failed Transfers"), "cancel");
+ // END bottom
+
+ // BEGIN left
+ m_leftSidebar = new KFTPWidgets::Sidebar(m_bottomSidebar->content(), KFTPWidgets::Sidebar::Left);
+ m_leftSidebar->setVisible(KFTPCore::Config::showLeftSidebar());
+
+ // Add the bookmarks sidebar
+ m_bookmarkSidebar = new KFTPWidgets::Bookmarks::Sidebar(0, "bookmarks");
+
+ // Add the zeroconf sidebar
+ m_zeroconfSidebar = new KFTPZeroConfListView(0, "zeroconf");
+
+ m_leftSidebar->addSidebar(m_bookmarkSidebar, i18n("Bookmarks"), "bookmark");
+ m_leftSidebar->addSidebar(m_zeroconfSidebar, i18n("Sites Near Me"), "lan");
+ // END left
+}
+
+void MainWindow::initMainView()
+{
+ setCentralWidget(new QWidget(this, "qt_central_widget"));
+
+ QHBoxLayout *mainLayout = new QHBoxLayout(centralWidget(), 0, 0, "tLayout");
+
+ // Create the sidebars
+ initSidebars();
+
+ mainLayout->addWidget(m_bottomSidebar);
+
+ QSplitter *splitter = new QSplitter(m_leftSidebar->content());
+
+ // Session layouts
+ QWidget *box_1 = new QWidget(splitter);
+ QWidget *box_2 = new QWidget(splitter);
+
+ QHBoxLayout *lay_1 = new QHBoxLayout(box_1);
+ QHBoxLayout *lay_2 = new QHBoxLayout(box_2);
+
+ KFTPTabWidget *leftTabs = new KFTPTabWidget(box_1, "TabWidgetLeft");
+ KFTPTabWidget *rightTabs = new KFTPTabWidget(box_2, "TabWidgetRight");
+
+ leftTabs->setHoverCloseButton(true);
+ rightTabs->setHoverCloseButton(true);
+
+ lay_1->addWidget(leftTabs);
+ lay_2->addWidget(rightTabs);
+
+ // Create the session manager
+ new KFTPSession::Manager(this, new QTabWidget(0, "logs"), leftTabs, rightTabs);
+
+ // Add some sidebars that can't be added before the session manager is created
+ m_bottomSidebar->addSidebar(new KFTPWidgets::ThreadView(0, "threads"), i18n("Threads"), "socket");
+ m_bottomSidebar->addSidebar(KFTPSession::Manager::self()->getStatTabs(), i18n("Log"), "info");
+ m_bottomSidebar->addSidebar(m_trafficGraph, i18n("Traffic"), "share");
+}
+
+void MainWindow::slotUpdateStatusBar()
+{
+ // Status bar
+ statusBar()->changeItem(i18n("Download: %1/s").arg(KIO::convertSize(KFTPQueue::Manager::self()->getDownloadSpeed())), 2);
+ statusBar()->changeItem(i18n("Upload: %1/s").arg(KIO::convertSize(KFTPQueue::Manager::self()->getUploadSpeed())), 3);
+}
+
+void MainWindow::slotUpdateTrafficGraph()
+{
+ // Update the traffic graph
+ if (m_trafficGraph) {
+ QValueList<double> trafficList;
+ trafficList.append((double) KFTPQueue::Manager::self()->getDownloadSpeed() / 1024);
+ trafficList.append((double) KFTPQueue::Manager::self()->getUploadSpeed() / 1024);
+
+ m_trafficGraph->addSample(trafficList);
+ }
+}
+
+void MainWindow::slotQuickConnect(const QString &title, const QString &host, int port)
+{
+ // Create/get the new dialog
+ KFTPWidgets::QuickConnectDialog *quickConnect = new KFTPWidgets::QuickConnectDialog(this);
+
+ quickConnect->setCaption(title);
+ quickConnect->setHost(host);
+ quickConnect->setPort(port);
+
+ if (!host.isEmpty())
+ quickConnect->setFocusToUser();
+
+ if (quickConnect->exec() == KDialogBase::Accepted) {
+ // Get the url and connect
+ KFTPSession::Session *session = KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, quickConnect->getUrl());
+
+ // Configure the client socket
+ quickConnect->setupClient(session->getClient());
+ }
+
+ delete quickConnect;
+}
+
+void MainWindow::slotConfigChanged()
+{
+ m_leftSidebar->setVisible(KFTPCore::Config::showLeftSidebar());
+}
+
+#include "mainwindow.moc"
diff --git a/kftpgrabber/src/mainwindow.h b/kftpgrabber/src/mainwindow.h
new file mode 100644
index 0000000..c173a42
--- /dev/null
+++ b/kftpgrabber/src/mainwindow.h
@@ -0,0 +1,141 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef MAINWINDOW_H_
+#define MAINWINDOW_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qtimer.h>
+
+#include <kmainwindow.h>
+#include <kaction.h>
+
+class KFTPZeroConfListView;
+class MainActions;
+
+namespace KFTPWidgets {
+namespace Bookmarks {
+ class Sidebar;
+}
+
+ class Sidebar;
+ class TrafficGraph;
+ class QueueView;
+}
+
+/**
+ * @short Application Main Window
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class MainWindow : public KMainWindow
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ */
+ MainWindow();
+
+ /**
+ * Class destructor.
+ */
+ ~MainWindow();
+
+ /**
+ * Get main actions instance.
+ *
+ * @return A valid instance of MainActions
+ */
+ MainActions *getActions() { return m_actions; }
+protected:
+ /**
+ * Initialize the traffic graph widget.
+ */
+ void initTrafficGraph();
+
+ /**
+ * Initialize the status bar.
+ */
+ void initStatusBar();
+
+ /**
+ * Create the main user interface.
+ */
+ void initMainView();
+
+ /**
+ * Initialize sidebars.
+ */
+ void initSidebars();
+
+ /**
+ * This method gets called when the user attempts to close the
+ * application.
+ */
+ bool queryClose();
+private:
+ QTimer *m_graphTimer;
+ MainActions *m_actions;
+
+ KActionMenu *m_bookmarkMenu;
+ KActionMenu *m_zeroconfMenu;
+ KActionMenu *m_walletMenu;
+
+ KFTPWidgets::Sidebar *m_leftSidebar;
+ KFTPWidgets::Sidebar *m_bottomSidebar;
+
+ KFTPWidgets::Bookmarks::Sidebar *m_bookmarkSidebar;
+
+ KFTPWidgets::TrafficGraph *m_trafficGraph;
+
+ KFTPZeroConfListView *m_zeroconfSidebar;
+ KFTPWidgets::QueueView *m_queueView;
+public slots:
+ void initBookmarkMenu();
+ void slotQuickConnect(const QString &title = QString::null, const QString &host = QString::null, int port = 21);
+private slots:
+ void appShutdown();
+ void showBookmarkEditor();
+ void slotUpdateStatusBar();
+ void slotReadBookmarks();
+ void slotUpdateTrafficGraph();
+ void slotConfigChanged();
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/Makefile.am b/kftpgrabber/src/misc/Makefile.am
new file mode 100644
index 0000000..8250ffc
--- /dev/null
+++ b/kftpgrabber/src/misc/Makefile.am
@@ -0,0 +1,23 @@
+INCLUDES = -I$(srcdir)/.. \
+ -I$(srcdir)/../engine \
+ -I$(srcdir)/../misc/interfaces \
+ $(all_includes)
+
+METASOURCES = AUTO
+noinst_LIBRARIES = libkftpgrabbercore.a
+libkftpgrabbercore_a_SOURCES = misc.cpp kftpotpgenerator.cpp \
+ kftpapi.cpp desencryptor.cpp kftpwalletconnection.cpp \
+ kftppluginmanager.cpp \
+ kftpzeroconf.cpp config.kcfgc configbase.cpp filter.cpp \
+ filterwidgethandler.cpp
+
+libkftpgrabbercore_a_LIBADD = interfaces/libkftpinterfaces.la customcommands/libcustomcommands.a
+
+kde_kcfg_DATA = kftpgrabber.kcfg
+
+noinst_HEADERS = misc.h kftpotpgenerator.h kftpapi.h desencryptor.h \
+ kftpwalletconnection.h kftppluginmanager.h kftpzeroconf.h \
+ configbase.h filter.h filterwidgethandler.h
+
+SUBDIRS = interfaces plugins libs customcommands
+
diff --git a/kftpgrabber/src/misc/config.kcfgc b/kftpgrabber/src/misc/config.kcfgc
new file mode 100644
index 0000000..d8ca269
--- /dev/null
+++ b/kftpgrabber/src/misc/config.kcfgc
@@ -0,0 +1,7 @@
+File=kftpgrabber.kcfg
+ClassName=Config
+Inherits=ConfigBase
+NameSpace=KFTPCore
+Singleton=true
+Mutators=true
+IncludeFiles=configbase.h
diff --git a/kftpgrabber/src/misc/configbase.cpp b/kftpgrabber/src/misc/configbase.cpp
new file mode 100644
index 0000000..39d58e4
--- /dev/null
+++ b/kftpgrabber/src/misc/configbase.cpp
@@ -0,0 +1,141 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "configbase.h"
+#include "config.h"
+#include "kftpapi.h"
+#include "filter.h"
+
+#include <qregexp.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kemailsettings.h>
+#include <klocale.h>
+
+namespace KFTPCore {
+
+ConfigBase::ConfigBase(const QString &fileName)
+ : QObject(),
+ KConfigSkeleton(fileName)
+{
+ m_fileExistsDownActions.setTypeText(i18n("Download"));
+ m_fileExistsUpActions.setTypeText(i18n("Upload"));
+ m_fileExistsFxpActions.setTypeText(i18n("FXP"));
+
+ m_transMode = 'I';
+}
+
+void ConfigBase::postInit()
+{
+ // Restore the actions
+ QString tmp = Config::downloadActions();
+ tmp >> m_fileExistsDownActions;
+
+ tmp = Config::uploadActions();
+ tmp >> m_fileExistsUpActions;
+
+ tmp = Config::fxpActions();
+ tmp >> m_fileExistsFxpActions;
+}
+
+void ConfigBase::saveConfig()
+{
+ // Save actions before writing
+ QString tmp;
+ tmp << m_fileExistsDownActions;
+ Config::setDownloadActions(tmp);
+
+ tmp << m_fileExistsUpActions;
+ Config::setUploadActions(tmp);
+
+ tmp << m_fileExistsFxpActions;
+ Config::setFxpActions(tmp);
+
+ // Save the window's position
+ Config::setSize(KFTPAPI::getInstance()->mainWindow()->size());
+ Config::setPosition(KFTPAPI::getInstance()->mainWindow()->pos());
+
+ // Save filters
+ Filter::Filters::self()->save();
+
+ // Write the config
+ writeConfig();
+}
+
+void ConfigBase::emitChange()
+{
+ emit configChanged();
+}
+
+char ConfigBase::ftpMode(const QString &filename)
+{
+ // Get FTP mode (binary/ascii)
+ switch (m_transMode) {
+ case 'A': return 'A'; break;
+ case 'I': return 'I'; break;
+ case 'X':
+ default: {
+ char mode = 'I';
+ QRegExp e;
+ e.setWildcard(true);
+
+ QStringList list = Config::asciiList();
+ QStringList::iterator end(list.end());
+ for (QStringList::iterator i(list.begin()); i != end; ++i) {
+ e.setPattern((*i));
+
+ if (e.exactMatch(filename)) {
+ mode = 'A';
+ break;
+ }
+ }
+
+ return mode;
+ }
+ }
+}
+
+QString ConfigBase::getGlobalMail()
+{
+ KEMailSettings kes;
+ kes.setProfile(kes.defaultProfileName());
+ return kes.getSetting(KEMailSettings::EmailAddress);
+}
+
+}
+
+#include "configbase.moc"
diff --git a/kftpgrabber/src/misc/configbase.h b/kftpgrabber/src/misc/configbase.h
new file mode 100644
index 0000000..50e1d7a
--- /dev/null
+++ b/kftpgrabber/src/misc/configbase.h
@@ -0,0 +1,137 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPCORECONFIGBASE_H
+#define KFTPCORECONFIGBASE_H
+
+#include <qobject.h>
+
+#include <kconfigskeleton.h>
+
+#include "kftpfileexistsactions.h"
+
+#define PRIO_SKIP 0
+#define PRIO_NOT_FOUND -999
+
+namespace KFTPCore {
+
+/**
+ * This is a base class for KFTPGrabber's configuration. It is inherited by
+ * auto-generated KConfigXT class KFTPCore::Config that adds all the configuration
+ * options.
+ *
+ * @author Jernej Kos
+ */
+class ConfigBase : public QObject, public KConfigSkeleton
+{
+Q_OBJECT
+public:
+ ConfigBase(const QString &fileName);
+
+ /**
+ * Does some post initialization stuff that couldn't be done in the constructor due
+ * to use of Config singleton.
+ */
+ void postInit();
+
+ /**
+ * Does some pre write stuff (eg. exporting the actions).
+ */
+ void saveConfig();
+
+ /**
+ * Returns a proper mode for the requested file. If the current mode is set to AUTO
+ * the list of ascii file patterns is consulted.
+ *
+ * @param filename The filename for which the mode should be returned
+ * @return A valid FTP transfer mode
+ */
+ char ftpMode(const QString &filename);
+
+ /**
+ * Set the global transfer mode.
+ *
+ * @param mode Transfer mode
+ */
+ void setGlobalMode(char mode) { m_transMode = mode; }
+
+ /**
+ * Get the global transfer mode.
+ *
+ * @return The transfer mode currently in use
+ */
+ char getGlobalMode() { return m_transMode; }
+
+ /**
+ * Get the download actions object.
+ *
+ * @return The FileExistsActions object for download actions
+ */
+ KFTPQueue::FileExistsActions *dActions() { return &m_fileExistsDownActions; }
+
+ /**
+ * Get the upload actions object.
+ *
+ * @return The FileExistsActions object for upload actions
+ */
+ KFTPQueue::FileExistsActions *uActions() { return &m_fileExistsUpActions; }
+
+ /**
+ * Get the fxp actions object.
+ *
+ * @return The FileExistsActions object for fxp actions
+ */
+ KFTPQueue::FileExistsActions *fActions() { return &m_fileExistsFxpActions; }
+public slots:
+ /**
+ * Emits the configChanged() signal.
+ */
+ void emitChange();
+protected:
+ QString getGlobalMail();
+private:
+ KFTPQueue::FileExistsActions m_fileExistsDownActions;
+ KFTPQueue::FileExistsActions m_fileExistsUpActions;
+ KFTPQueue::FileExistsActions m_fileExistsFxpActions;
+
+ char m_transMode;
+signals:
+ void configChanged();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/customcommands/Makefile.am b/kftpgrabber/src/misc/customcommands/Makefile.am
new file mode 100644
index 0000000..8436cf4
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = -I$(srcdir)/../.. \
+ -I$(srcdir)/.. \
+ -I$(srcdir)/../../engine \
+ -I$(srcdir)/../../misc/interfaces \
+ -I$(srcdir)/../../widgets \
+ $(all_includes)
+METASOURCES = AUTO
+noinst_LIBRARIES = libcustomcommands.a
+noinst_HEADERS = handlers.h entry.h manager.h parameterentrydialog.h \
+ responsedialog.h
+libcustomcommands_a_SOURCES = handlers.cpp entry.cpp manager.cpp \
+ parameterentrydialog.cpp responsedialog.cpp
+
+shellrcdir = $(kde_datadir)/kftpgrabber
+shellrc_DATA = commands.xml
+
diff --git a/kftpgrabber/src/misc/customcommands/commands.xml b/kftpgrabber/src/misc/customcommands/commands.xml
new file mode 100644
index 0000000..82bde8e
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/commands.xml
@@ -0,0 +1,113 @@
+<commands>
+ <category name="GlFTPd">
+ <category name="Information">
+ <entry name="Show current aliases">
+ <description>Shows current user aliases.</description>
+ <command>SITE ALIAS</command>
+ <response handler="Raw" display="Window">
+ <expected code="2" />
+ </response>
+ </entry>
+
+ <entry name="Show group info" icon="info">
+ <description>Shows group information.</description>
+ <command>SITE GRP %1</command>
+ <params>
+ <param type="String">Group name</param>
+ </params>
+ <response handler="Raw" display="Window">
+ <expected code="2" />
+ </response>
+ </entry>
+
+ <entry name="Show your idle time">
+ <description>Shows your current idle time.</description>
+ <command>SITE IDLE</command>
+ <response handler="Raw" display="Window">
+ <expected code="2" />
+ </response>
+ </entry>
+
+ <entry name="Show online users">
+ <description>Shows the users that are currently online.</description>
+ <command>SITE WHO</command>
+ <response handler="Raw" display="Window">
+ <expected code="2" />
+ </response>
+ </entry>
+
+ <entry name="Show welcome screen">
+ <description>Shows the welcome screen.</description>
+ <command>SITE WELCOME</command>
+ <response handler="Raw" display="Window">
+ <expected code="2" />
+ </response>
+ </entry>
+
+ <separator />
+
+ <entry name="Set your idle time">
+ <description>Sets your maximum idle time (in seconds).</description>
+ <command>SITE IDLE %1</command>
+ <params>
+ <param type="Integer">Idle time</param>
+ </params>
+ <response handler="Substitute" display="MessageBox">
+ <expected code="2" />
+ <text>Idle time successfully changed.</text>
+ </response>
+ </entry>
+
+ <entry name="Change your password" icon="password">
+ <description>Changes your account password.</description>
+ <command>SITE PASSWD %1</command>
+ <params>
+ <param type="Password">Password</param>
+ </params>
+ <response handler="Substitute" display="MessageBox">
+ <expected code="2" />
+ <text>Password successfully changed.</text>
+ </response>
+ </entry>
+ </category>
+
+ <category name="User Management">
+ <entry name="Delete a user" icon="editdelete">
+ <description>Removes a user from the server's user database.</description>
+ <command>SITE DELUSER %1</command>
+ <params>
+ <param type="String">Username</param>
+ </params>
+ <response handler="Substitute" display="MessageBox">
+ <expected code="2" />
+ <text>User successfully removed.</text>
+ </response>
+ </entry>
+
+ <entry name="Change user's password" icon="password">
+ <description>Changes a user's password.</description>
+ <command>SITE CHPASS %1 %2</command>
+ <params>
+ <param type="String">Username</param>
+ <param type="Password">New password</param>
+ </params>
+ <response handler="Substitute" display="MessageBox">
+ <expected code="2" />
+ <text>Password successfully changed.</text>
+ </response>
+ </entry>
+
+ <entry name="Kick a user from this server">
+ <description>Terminates all connections for the specified user.</description>
+ <command>SITE KICK %1</command>
+ <params>
+ <param type="String">Username</param>
+ </params>
+ <response handler="Substitute" display="MessageBox">
+ <expected code="2" />
+ <text>User has been kicked.</text>
+ </response>
+ </entry>
+ </category>
+ </category>
+</commands> \ No newline at end of file
diff --git a/kftpgrabber/src/misc/customcommands/entry.cpp b/kftpgrabber/src/misc/customcommands/entry.cpp
new file mode 100644
index 0000000..346f3cf
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/entry.cpp
@@ -0,0 +1,155 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "entry.h"
+#include "kftpsession.h"
+#include "manager.h"
+
+#include "parameterentrydialog.h"
+#include "responsedialog.h"
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+Entry::Entry(QObject *parent, const QString &name)
+ : QObject(parent),
+ m_name(name)
+{
+}
+
+void Entry::appendParameter(ParameterType type, const QString &name)
+{
+ m_params.append(Parameter(type, name));
+}
+
+void Entry::setResponseHandler(const QString &handler, QDomNode args)
+{
+ m_handler = handler;
+ m_handlerArguments = args;
+}
+
+void Entry::execute(KFTPSession::Session *session)
+{
+ // Create a dialog for parameter input
+ QString command = m_command;
+
+ if (m_params.count() > 0) {
+ ParameterEntryDialog *dialog = new ParameterEntryDialog(this, m_params);
+ if (dialog->exec() != QDialog::Accepted) {
+ delete dialog;
+ return;
+ }
+
+ command = dialog->formatCommand(command);
+ delete dialog;
+ }
+
+ // Execute the command with proper parameters
+ m_lastSession = session;
+
+ connect(session->getClient()->eventHandler(), SIGNAL(gotRawResponse(const QString&)), this, SLOT(handleResponse(const QString&)));
+ session->getClient()->raw(command);
+}
+
+void Entry::handleResponse(const QString &response)
+{
+ if (!m_lastSession)
+ return;
+
+ m_lastSession->getClient()->eventHandler()->QObject::disconnect(this);
+ m_lastSession = 0;
+
+ // Invoke the proper handler
+ QString expectedReturn = m_handlerArguments.namedItem("expected").toElement().attribute("code");
+
+ if (!response.startsWith(expectedReturn)) {
+ KMessageBox::error(0, i18n("<qt>Requested operation has failed! Response from server is:<br/><br /><b>%1</b></qt>").arg(response));
+ return;
+ }
+
+ Handlers::Handler *handler = Manager::self()->handler(m_handler);
+
+ if (!handler) {
+ KMessageBox::error(0, i18n("<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>").arg(m_handler));
+ return;
+ }
+
+ QString parsed = handler->handleResponse(response, m_handlerArguments);
+
+ // Find the proper way to display the parsed response
+ switch (m_displayType) {
+ case None: return;
+ case Window: {
+ ResponseDialog *dialog = new ResponseDialog(m_name, parsed);
+ dialog->exec();
+ delete dialog;
+ break;
+ }
+ case MessageBox: {
+ KMessageBox::information(0, parsed);
+ break;
+ }
+ }
+}
+
+Entry::Parameter::Parameter()
+ : m_type(String),
+ m_name("<invalid>")
+{
+}
+
+Entry::Parameter::Parameter(ParameterType type, const QString &name)
+ : m_type(type),
+ m_name(name)
+{
+}
+
+EntryAction::EntryAction(Entry *entry, KFTPSession::Session *session)
+ : KAction(entry->name(), entry->icon()),
+ m_entryInfo(entry),
+ m_session(session)
+{
+}
+
+}
+
+}
+
+#include "entry.moc"
+
diff --git a/kftpgrabber/src/misc/customcommands/entry.h b/kftpgrabber/src/misc/customcommands/entry.h
new file mode 100644
index 0000000..e7c82c4
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/entry.h
@@ -0,0 +1,236 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_CUSTOMCOMMANDSENTRY_H
+#define KFTPCORE_CUSTOMCOMMANDSENTRY_H
+
+#include <qdom.h>
+#include <qvaluelist.h>
+
+#include <kaction.h>
+
+namespace KFTPSession {
+ class Session;
+}
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+/**
+ * This class represents a single custom command entry. A tree of
+ * such objects is constructed from an XML file.
+ *
+ * @author Jernej Kos
+ */
+class Entry : public QObject {
+Q_OBJECT
+public:
+ /**
+ * Possible parameter types.
+ */
+ enum ParameterType {
+ String,
+ Password,
+ Integer
+ };
+
+ /**
+ * Possible display types.
+ */
+ enum DisplayType {
+ None,
+ Window,
+ MessageBox
+ };
+
+ /**
+ * A single command parameter.
+ */
+ class Parameter {
+ public:
+ /**
+ * Class constructor.
+ */
+ Parameter();
+
+ /**
+ * Class constructor.
+ *
+ * @param type Parameter type
+ * @param name Parameter name
+ */
+ Parameter(ParameterType type, const QString &name);
+
+ /**
+ * Returns the parameter type.
+ */
+ ParameterType type() const { return m_type; }
+
+ /**
+ * Returns the parameter name.
+ */
+ QString name() const { return m_name; }
+ private:
+ ParameterType m_type;
+ QString m_name;
+ };
+
+ /**
+ * Class constructor.
+ *
+ * @param name Short entry name
+ */
+ Entry(QObject *parent, const QString &name);
+
+ /**
+ * Returns entry's name.
+ */
+ QString name() const { return m_name; }
+
+ /**
+ * Returns entry's description.
+ */
+ QString description() const { return m_description; }
+
+ /**
+ * Returns entry's icon name.
+ */
+ QString icon() const { return m_icon; }
+
+ /**
+ * Sets entry's description.
+ *
+ * @param description A longer entry description; can be rich text
+ */
+ void setDescription(const QString &description) { m_description = description; }
+
+ /**
+ * Set entry's icon.
+ *
+ * @param icon An icon name
+ */
+ void setIcon(const QString &icon) { m_icon = icon; }
+
+ /**
+ * Sets the raw command to be sent.
+ *
+ * @param command A valid FTP command with optional parameter placeholders
+ */
+ void setCommand(const QString &command) { m_command = command; }
+
+ /**
+ * Appends a command parameter.
+ *
+ * @param type Parameter type
+ * @param name Human readable parameter name
+ */
+ void appendParameter(ParameterType type, const QString &name);
+
+ /**
+ * Sets response display type.
+ *
+ * @param type Display type
+ */
+ void setDisplayType(DisplayType type) { m_displayType = type; }
+
+ /**
+ * Sets the response handler to use.
+ *
+ * @param handler Handler name
+ * @param args Optional argument node
+ */
+ void setResponseHandler(const QString &handler, QDomNode args);
+
+ /**
+ * Executes this entry. This will actually generate and show a proper
+ * user input dialog, execute the command with the provided parameters,
+ * pass the raw response to a selected handler and properly display
+ * the result.
+ *
+ * @param session A remote session where command should be executed
+ */
+ void execute(KFTPSession::Session *session);
+private slots:
+ void handleResponse(const QString &response);
+private:
+ QString m_name;
+ QString m_description;
+ QString m_icon;
+ QString m_command;
+ QString m_handler;
+ DisplayType m_displayType;
+
+ QValueList<Parameter> m_params;
+ QDomNode m_handlerArguments;
+
+ KFTPSession::Session *m_lastSession;
+};
+
+/**
+ * This class is a wrapper action, so a proper entry gets pulled and
+ * executed.
+ *
+ * @author Jernej Kos
+ */
+class EntryAction : public KAction {
+public:
+ /**
+ * Class constructor.
+ *
+ * @param entry Associated entry
+ * @param session Associated session
+ */
+ EntryAction(Entry *entry, KFTPSession::Session *session);
+
+ /**
+ * Returns the associated entry instance.
+ */
+ Entry *entryInfo() const { return m_entryInfo; }
+
+ /**
+ * Returns the associated session instance.
+ */
+ KFTPSession::Session *session() const { return m_session; }
+private:
+ Entry *m_entryInfo;
+ KFTPSession::Session *m_session;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/customcommands/handlers.cpp b/kftpgrabber/src/misc/customcommands/handlers.cpp
new file mode 100644
index 0000000..8cf5349
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/handlers.cpp
@@ -0,0 +1,97 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "handlers.h"
+
+#include <qdom.h>
+#include <qregexp.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+namespace Handlers {
+
+Handler::Handler(const QString &name)
+ : m_name(name)
+{
+}
+
+RawHandler::RawHandler()
+ : Handler("Raw")
+{
+}
+
+SubstituteHandler::SubstituteHandler()
+ : Handler("Substitue")
+{
+}
+
+QString SubstituteHandler::handleResponse(const QString &raw, QDomNode arguments) const
+{
+ QString text = arguments.namedItem("text").toElement().text();
+
+ if (text.contains("%1"))
+ return text.arg(raw);
+
+ return text;
+}
+
+RegexpHandler::RegexpHandler()
+ : Handler("Regexp")
+{
+}
+
+QString RegexpHandler::handleResponse(const QString &raw, QDomNode arguments) const
+{
+ QString result;
+ QRegExp e(arguments.namedItem("match").toElement().text());
+
+ if (e.exactMatch(raw.stripWhiteSpace())) {
+ result = arguments.namedItem("display").toElement().text();
+
+ for (int i = 1; i <= e.numCaptures(); i++) {
+ result.replace(QString("\\%1").arg(i), e.cap(i));
+ }
+ }
+
+ return result;
+}
+
+}
+
+}
+
+}
diff --git a/kftpgrabber/src/misc/customcommands/handlers.h b/kftpgrabber/src/misc/customcommands/handlers.h
new file mode 100644
index 0000000..f41a3de
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/handlers.h
@@ -0,0 +1,147 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_CUSTOMCOMMANDS_HANDLERSHANDLERS_H
+#define KFTPCORE_CUSTOMCOMMANDS_HANDLERSHANDLERS_H
+
+#include <qstring.h>
+#include <qdom.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+namespace Handlers {
+
+/**
+ * The handler class is an abstract class which every actual handler
+ * must implement.
+ *
+ * @author Jernej Kos
+ */
+class Handler {
+public:
+ /**
+ * Class constructor.
+ *
+ * @param name Handler name
+ */
+ Handler(const QString &name);
+
+ /**
+ * Returns the handler's name.
+ */
+ QString name() const { return m_name; }
+
+ /**
+ * This method should be implemented by actual handlers to handler the
+ * server response.
+ *
+ * @param raw Raw FTP response
+ * @param arguments Any argument nodes supplied in the XML file
+ * @return This method should return a formatted string
+ */
+ virtual QString handleResponse(const QString &raw, QDomNode arguments) const = 0;
+private:
+ QString m_name;
+};
+
+/**
+ * The Raw handler accepts no arguments and simply passes on raw data.
+ *
+ * @author Jernej Kos
+ */
+class RawHandler : public Handler {
+public:
+ /**
+ * Class constructor.
+ */
+ RawHandler();
+
+ /**
+ * @overload
+ * Reimplemented from Handler.
+ */
+ QString handleResponse(const QString &raw, QDomNode) const { return raw; }
+};
+
+/**
+ * The Substitue handler always returns a predefined value when the
+ * operation is completed successfully. %1 can be used in place of the
+ * raw data received from the server.
+ *
+ * @author Jernej Kos
+ */
+class SubstituteHandler : public Handler {
+public:
+ /**
+ * Class constructor.
+ */
+ SubstituteHandler();
+
+ /**
+ * @overload
+ * Reimplemented from Handler.
+ */
+ QString handleResponse(const QString &raw, QDomNode arguments) const;
+};
+
+/**
+ * The Regexp handler enables custom response parsing using regular
+ * expressions.
+ *
+ * @author Jernej Kos
+ */
+class RegexpHandler : public Handler {
+public:
+ /**
+ * Class constructor.
+ */
+ RegexpHandler();
+
+ /**
+ * @overload
+ * Reimplemented from Handler.
+ */
+ QString handleResponse(const QString &raw, QDomNode arguments) const;
+};
+
+}
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/customcommands/manager.cpp b/kftpgrabber/src/misc/customcommands/manager.cpp
new file mode 100644
index 0000000..1cda06a
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/manager.cpp
@@ -0,0 +1,211 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "manager.h"
+#include "entry.h"
+
+#include <qfile.h>
+
+#include <kstandarddirs.h>
+#include <kstaticdeleter.h>
+#include <kpopupmenu.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+Manager *Manager::m_self = 0;
+static KStaticDeleter<Manager> staticManagerDeleter;
+
+Manager *Manager::self()
+{
+ if (!m_self) {
+ staticManagerDeleter.setObject(m_self, new Manager());
+ }
+
+ return m_self;
+}
+
+Manager::Manager()
+ : QObject()
+{
+ // Populate the handlers list
+ m_handlers["Raw"] = new Handlers::RawHandler();
+ m_handlers["Substitute"] = new Handlers::SubstituteHandler();
+ m_handlers["Regexp"] = new Handlers::RegexpHandler();
+}
+
+Manager::~Manager()
+{
+ if (m_self == this)
+ staticManagerDeleter.setObject(m_self, 0, false);
+
+ // Destroy the handlers
+ delete static_cast<Handlers::RawHandler*>(m_handlers["Raw"]);
+ delete static_cast<Handlers::SubstituteHandler*>(m_handlers["Substitute"]);
+ delete static_cast<Handlers::RegexpHandler*>(m_handlers["Regexp"]);
+
+ m_handlers.clear();
+}
+
+void Manager::load()
+{
+ QString filename = locateLocal("appdata", "commands.xml");
+
+ if (!QFile::exists(filename)) {
+ // Copy the default command set over
+ QFile source(locate("appdata", "commands.xml"));
+ QFile destination(filename);
+
+ source.open(IO_ReadOnly);
+ destination.open(IO_WriteOnly | IO_Truncate);
+
+ destination.writeBlock(source.readAll());
+ source.close();
+ destination.close();
+ }
+
+ QFile file(filename);
+ if (!file.open(IO_ReadOnly))
+ return;
+
+ m_document.setContent(&file);
+ file.close();
+}
+
+void Manager::parseEntries(KActionMenu *parentMenu, const QDomNode &parentNode, KFTPSession::Session *session) const
+{
+ QDomNode n = parentNode.firstChild();
+
+ while (!n.isNull()) {
+ if (n.isElement()) {
+ QDomElement e = n.toElement();
+ QString tagName = e.tagName();
+ QString name = e.attribute("name");
+
+ if (tagName == "category") {
+ KActionMenu *menu = new KActionMenu(name, "folder", parentMenu);
+ parentMenu->insert(menu);
+
+ // Recurse into this category
+ parseEntries(menu, n, session);
+ } else if (tagName == "entry") {
+ Entry *entry = new Entry((Manager*) this, name);
+ entry->setDescription(n.namedItem("description").toElement().text());
+ entry->setIcon(e.attribute("icon"));
+ entry->setCommand(n.namedItem("command").toElement().text());
+
+ QDomNode p = n.namedItem("params").firstChild();
+ while (!p.isNull()) {
+ QDomElement pElement = p.toElement();
+
+ if (pElement.tagName() == "param") {
+ QString typeString = pElement.attribute("type");
+ Entry::ParameterType type = Entry::String;
+
+ if (typeString == "String")
+ type = Entry::String;
+ else if (typeString == "Password")
+ type = Entry::Password;
+ else if (typeString == "Integer")
+ type = Entry::Integer;
+
+ entry->appendParameter(type, pElement.text());
+ }
+
+ p = p.nextSibling();
+ }
+
+ QDomElement rElement = n.namedItem("response").toElement();
+ entry->setResponseHandler(rElement.attribute("handler"), rElement);
+
+ QString displayString = rElement.attribute("display");
+ Entry::DisplayType displayType = Entry::None;
+
+ if (displayString == "None")
+ displayType = Entry::None;
+ else if (displayString == "Window")
+ displayType = Entry::Window;
+ else if (displayString == "MessageBox")
+ displayType = Entry::MessageBox;
+
+ entry->setDisplayType(displayType);
+
+ // Create a new action
+ EntryAction *action = new EntryAction(entry, session);
+ connect(action, SIGNAL(activated()), this, SLOT(slotActionActivated()));
+
+ parentMenu->insert(action);
+ } else if (tagName == "separator") {
+ parentMenu->popupMenu()->insertSeparator();
+ } else {
+ KMessageBox::error(0, i18n("Unknown tag while parsing custom site commands!"));
+ }
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+Handlers::Handler *Manager::handler(const QString &name) const
+{
+ if (m_handlers.contains(name))
+ return m_handlers[name];
+
+ return 0;
+}
+
+KActionMenu *Manager::categories(const QString &name, KFTPSession::Session *session) const
+{
+ KActionMenu *actionMenu = new KActionMenu(name);
+ parseEntries(actionMenu, m_document.documentElement(), session);
+
+ return actionMenu;
+}
+
+void Manager::slotActionActivated()
+{
+ EntryAction *action = (EntryAction*) QObject::sender();
+ action->entryInfo()->execute(action->session());
+}
+
+}
+
+}
+
+#include "manager.moc"
+
diff --git a/kftpgrabber/src/misc/customcommands/manager.h b/kftpgrabber/src/misc/customcommands/manager.h
new file mode 100644
index 0000000..db5dd6d
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/manager.h
@@ -0,0 +1,118 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_CUSTOMCOMMANDSMANAGER_H
+#define KFTPCORE_CUSTOMCOMMANDSMANAGER_H
+
+#include <qobject.h>
+#include <qdom.h>
+#include <qmap.h>
+
+#include <kaction.h>
+
+#include "handlers.h"
+
+namespace KFTPSession {
+ class Session;
+}
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+/**
+ * This class represents the entry manager. It parses the XML file and
+ * creates the necessary entries. This class is a singleton.
+ *
+ * @author Jernej Kos
+ */
+class Manager : public QObject {
+Q_OBJECT
+public:
+ /**
+ * Class destructor.
+ */
+ ~Manager();
+
+ /**
+ * Returns a Manager instance.
+ */
+ static Manager *self();
+
+ /**
+ * Returns an appropriate handler.
+ *
+ * @param name Handler string identifier
+ */
+ Handlers::Handler *handler(const QString &name) const;
+
+ /**
+ * Returns a KActionMenu that can be used for displaying categories of
+ * entries to the user.
+ */
+ KActionMenu *categories(const QString &name, KFTPSession::Session *session) const;
+public slots:
+ /**
+ * Loads a valid commands XML file.
+ */
+ void load();
+protected:
+ static Manager *m_self;
+
+ /**
+ * Class constructor.
+ */
+ Manager();
+
+ /**
+ * Recursive entry parser.
+ */
+ void parseEntries(KActionMenu *parentMenu, const QDomNode &parentNode, KFTPSession::Session *session) const;
+protected slots:
+ /**
+ * This slot gets called when an EntryAction is activated.
+ */
+ void slotActionActivated();
+private:
+ KActionMenu *m_categories;
+ QDomDocument m_document;
+ QMap<QString, Handlers::Handler*> m_handlers;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/customcommands/parameterentrydialog.cpp b/kftpgrabber/src/misc/customcommands/parameterentrydialog.cpp
new file mode 100644
index 0000000..808b400
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/parameterentrydialog.cpp
@@ -0,0 +1,131 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "parameterentrydialog.h"
+#include "entry.h"
+
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <kpassdlg.h>
+#include <knuminput.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+ParameterEntryDialog::ParameterEntryDialog(Entry *entry, QValueList<Entry::Parameter> params)
+ : KDialogBase(0, "", true, entry->name(), Ok|Cancel, Ok),
+ m_params(params)
+{
+ QFrame *mainWidget = makeMainWidget();
+ QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
+
+ QHBoxLayout *headerLayout = new QHBoxLayout(mainWidget);
+ QLabel *icon = new QLabel(mainWidget);
+ icon->setPixmap(DesktopIcon(entry->icon(), 32));
+ headerLayout->addWidget(icon);
+
+ QVBoxLayout *headerTextLayout = new QVBoxLayout(mainWidget);
+ headerTextLayout->addWidget(new QLabel(QString("<b>%1</b>").arg(entry->name()), mainWidget));
+ headerTextLayout->addWidget(new QLabel(entry->description(), mainWidget));
+ headerLayout->addLayout(headerTextLayout, 1);
+
+ mainLayout->addLayout(headerLayout);
+ mainLayout->addSpacing(5);
+
+ QFrame *frame = new QFrame(mainWidget);
+ frame->setFrameStyle(QFrame::StyledPanel | QFrame::Raised);
+
+ QVBoxLayout *frameLayout = new QVBoxLayout(frame);
+ frameLayout->setMargin(10);
+ mainLayout->addWidget(frame);
+
+ int num = 0;
+ QValueList<Entry::Parameter>::ConstIterator lend = params.end();
+ for (QValueList<Entry::Parameter>::ConstIterator i = params.begin(); i != lend; ++i) {
+ QHBoxLayout *layout = new QHBoxLayout(frame);
+ QWidget *entryWidget = 0;
+ QString name = QString("param_%1").arg(num++);
+
+ switch ((*i).type()) {
+ case Entry::String: entryWidget = new KLineEdit(frame, name.ascii()); break;
+ case Entry::Password: entryWidget = new KPasswordEdit(frame, name.ascii()); break;
+ case Entry::Integer: entryWidget = new KIntNumInput(frame, name.ascii()); break;
+ }
+
+ // The first widget should have focus
+ if (num == 1)
+ entryWidget->setFocus();
+
+ layout->addWidget(new QLabel((*i).name() + ":", frame));
+ layout->addStretch(1);
+ layout->addWidget(entryWidget);
+ frameLayout->addLayout(layout);
+ frameLayout->addSpacing(5);
+ }
+
+ setMaximumWidth(350);
+ resize(350, minimumHeight());
+}
+
+QString ParameterEntryDialog::formatCommand(const QString &command)
+{
+ QString tmp = command;
+
+ int num = 0;
+ QValueList<Entry::Parameter>::ConstIterator lend = m_params.end();
+ for (QValueList<Entry::Parameter>::ConstIterator i = m_params.begin(); i != lend; ++i) {
+ QObject *entryWidget = child(QString("param_%1").arg(num++).ascii());
+
+ switch ((*i).type()) {
+ case Entry::String: tmp = tmp.arg(static_cast<KLineEdit*>(entryWidget)->text()); break;
+ case Entry::Password: tmp = tmp.arg(static_cast<KPasswordEdit*>(entryWidget)->password()); break;
+ case Entry::Integer: tmp = tmp.arg(static_cast<KIntNumInput*>(entryWidget)->value()); break;
+ }
+ }
+
+ return tmp;
+}
+
+}
+
+}
+
+#include "parameterentrydialog.moc"
+
diff --git a/kftpgrabber/src/misc/customcommands/parameterentrydialog.h b/kftpgrabber/src/misc/customcommands/parameterentrydialog.h
new file mode 100644
index 0000000..3a7d242
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/parameterentrydialog.h
@@ -0,0 +1,79 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_CUSTOMCOMMANDSPARAMETERENTRYDIALOG_H
+#define KFTPCORE_CUSTOMCOMMANDSPARAMETERENTRYDIALOG_H
+
+#include <kdialogbase.h>
+#include <qvaluelist.h>
+
+#include "entry.h"
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+/**
+ * A dialog for parameter entry.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class ParameterEntryDialog : public KDialogBase {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param entry An entry instance
+ * @param params Parameter list
+ */
+ ParameterEntryDialog(Entry *entry, QValueList<Entry::Parameter> params);
+
+ /**
+ * Properly replaces the parameter placeholders with actual user
+ * entered values.
+ *
+ * @param command A command string with placeholders
+ */
+ QString formatCommand(const QString &command);
+private:
+ QValueList<Entry::Parameter> m_params;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/customcommands/responsedialog.cpp b/kftpgrabber/src/misc/customcommands/responsedialog.cpp
new file mode 100644
index 0000000..11970f9
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/responsedialog.cpp
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "responsedialog.h"
+
+#include <ktextedit.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+ResponseDialog::ResponseDialog(const QString &caption, const QString &response)
+ : KDialogBase(0, "", true, caption, Ok)
+{
+ KTextEdit *contents = new KTextEdit(this);
+ setMainWidget(contents);
+
+ contents->setTextFormat(Qt::LogText);
+ contents->unsetPalette();
+ contents->append(response);
+
+ setMinimumSize(500, 300);
+}
+
+}
+
+}
+
diff --git a/kftpgrabber/src/misc/customcommands/responsedialog.h b/kftpgrabber/src/misc/customcommands/responsedialog.h
new file mode 100644
index 0000000..ab370ee
--- /dev/null
+++ b/kftpgrabber/src/misc/customcommands/responsedialog.h
@@ -0,0 +1,65 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_CUSTOMCOMMANDSRESPONSEDIALOG_H
+#define KFTPCORE_CUSTOMCOMMANDSRESPONSEDIALOG_H
+
+#include <kdialogbase.h>
+
+namespace KFTPCore {
+
+namespace CustomCommands {
+
+/**
+ * A dialog for displaying operation results.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class ResponseDialog : public KDialogBase {
+public:
+ /**
+ * Class constructor.
+ *
+ * @param caption Dialog caption
+ * @param response Response text (can be rich-text)
+ */
+ ResponseDialog(const QString &caption, const QString &response);
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/desencryptor.cpp b/kftpgrabber/src/misc/desencryptor.cpp
new file mode 100644
index 0000000..d53fd5e
--- /dev/null
+++ b/kftpgrabber/src/misc/desencryptor.cpp
@@ -0,0 +1,119 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "desencryptor.h"
+
+#include <kmdcodec.h>
+#include <qfile.h>
+
+namespace KFTPGrabberBase {
+
+DESEncryptor::DESEncryptor()
+{
+}
+
+void DESEncryptor::DESExec(const QString &str, int mode)
+{
+ QCString string(str.ascii());
+ m_output = "";
+
+ QByteArray in;
+ QByteArray out;
+
+ if (mode == DES_DECRYPT) {
+ // Base64 decode the output
+ KCodecs::base64Decode(string, in);
+ } else {
+ in.resize(string.size());
+ memcpy(in.data(), string.data(), in.size());
+ }
+
+ // Read 8 chars at a time and encrypt/decrypt them
+ unsigned int i = 0;
+ char *o_message = (char*) malloc(8);
+ char *o_output = (char*) malloc(8);
+
+ memset(o_message, 0, 9);
+ memset(o_output, 0, 9);
+ //out.resize(in.size() * 2);
+
+ while (i < in.size()) {
+ out.resize(out.size() + 8);
+ memcpy(o_message, in.data() + i, 8);
+ DES_ecb_encrypt((DES_cblock *) o_message, (DES_cblock*) o_output, &m_schedule, mode);
+ memcpy(out.data() + i, o_output, 8);
+
+ // Next 8 bytes
+ i += 8;
+
+ // Clear everything
+ memset(o_message, 0, 9);
+ memset(o_output, 0, 9);
+ }
+
+ free(o_message);
+ free(o_output);
+
+ if (mode == DES_ENCRYPT) {
+ // Base64 encode the output
+ m_output = KCodecs::base64Encode(out).data();
+ } else {
+ m_output = QCString(out).data();
+ }
+}
+
+void DESEncryptor::setKey(const QString &key)
+{
+ // Setup our DES key
+ DES_string_to_key(key.ascii(), &m_key);
+ DES_set_key_checked(&m_key, &m_schedule);
+}
+
+void DESEncryptor::encrypt(const QString &string)
+{
+ DESExec(string, DES_ENCRYPT);
+}
+
+void DESEncryptor::decrypt(const QString &string)
+{
+ DESExec(string, DES_DECRYPT);
+}
+
+QString DESEncryptor::output()
+{
+ return m_output;
+}
+
+}
diff --git a/kftpgrabber/src/misc/desencryptor.h b/kftpgrabber/src/misc/desencryptor.h
new file mode 100644
index 0000000..bf9ab68
--- /dev/null
+++ b/kftpgrabber/src/misc/desencryptor.h
@@ -0,0 +1,71 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPGRABBERBASEDESENCRYPTOR_H
+#define KFTPGRABBERBASEDESENCRYPTOR_H
+
+/* OpenSSL includes */
+#include <openssl/des.h>
+
+#include <qstring.h>
+
+namespace KFTPGrabberBase {
+
+/**
+Class for encrypting text and files using OpenSSL's DES encryption.
+
+@author Jernej Kos
+*/
+class DESEncryptor{
+public:
+ DESEncryptor();
+
+ void setKey(const QString &key);
+ void encrypt(const QString &string);
+ void decrypt(const QString &string);
+
+ QString output();
+private:
+ DES_cblock m_key;
+ DES_key_schedule m_schedule;
+
+ QString m_output;
+
+ void DESExec(const QString &str, int mode);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/filter.cpp b/kftpgrabber/src/misc/filter.cpp
new file mode 100644
index 0000000..605eba7
--- /dev/null
+++ b/kftpgrabber/src/misc/filter.cpp
@@ -0,0 +1,421 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "filter.h"
+
+#include <qregexp.h>
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kstaticdeleter.h>
+#include <kconfig.h>
+
+namespace KFTPCore {
+
+namespace Filter {
+
+Condition::Condition(Field field, Type type, const QVariant &value)
+ : m_field(field),
+ m_type(type),
+ m_value(value)
+{
+}
+
+bool Condition::matches(const KFTPEngine::DirectoryEntry &entry) const
+{
+ bool result = false;
+ QString check;
+
+ switch (m_field) {
+ default:
+ case Filename: check = entry.filename(); break;
+ case EntryType: check = entry.type(); break;
+ case Size: check = QString::number(entry.size()); break;
+ }
+
+ switch (m_type) {
+ case None: result = false; break;
+
+ case Contains: result = (check.contains(m_value.toString()) > 0); break;
+ case ContainsNot: result = (check.contains(m_value.toString()) == 0); break;
+
+ case Is: result = (check == m_value.toString()); break;
+ case IsNot: result = (check != m_value.toString()); break;
+
+ case Matches: {
+ QRegExp r(m_value.toString());
+ result = (r.search(check) > -1);
+ break;
+ }
+ case MatchesNot: {
+ QRegExp r(m_value.toString());
+ result = (r.search(check) == -1);
+ break;
+ }
+
+ case Greater: result = (check.toULongLong() > m_value.toULongLong()); break;
+ case Smaller: result = (check.toULongLong() < m_value.toULongLong()); break;
+ }
+
+ return result;
+}
+
+ConditionChain::ConditionChain()
+ : QPtrList<Condition>(),
+ m_type(All)
+{
+ setAutoDelete(true);
+}
+
+ConditionChain::ConditionChain(Type type)
+ : QPtrList<Condition>(),
+ m_type(type)
+{
+ setAutoDelete(true);
+}
+
+bool ConditionChain::matches(const KFTPEngine::DirectoryEntry &entry) const
+{
+ if (isEmpty())
+ return false;
+
+ QPtrList<Condition>::ConstIterator le = end();
+ for (QPtrList<Condition>::ConstIterator i = begin(); i != le; ++i) {
+ bool match = (*i)->matches(entry);
+
+ if (match && m_type == Any)
+ return true;
+ else if (!match && m_type == All)
+ return false;
+ }
+
+ if (m_type == Any)
+ return false;
+
+ return true;
+}
+
+Action::Action()
+ : m_valid(false)
+{
+}
+
+Action::Action(Type type, const QVariant &value)
+ : m_valid(true),
+ m_type(type),
+ m_value(value)
+{
+}
+
+ActionChain::ActionChain()
+ : QPtrList<Action>()
+{
+ setAutoDelete(true);
+}
+
+const Action *ActionChain::getAction(Action::Type type) const
+{
+ ActionChain::ConstIterator le = end();
+ for (ActionChain::ConstIterator i = begin(); i != le; ++i)
+ if ((*i)->type() == type)
+ return (*i);
+
+ return 0;
+}
+
+Rule::Rule()
+ : m_name(QString::null),
+ m_enabled(false)
+{
+}
+
+Rule::Rule(const Rule *rule)
+ : m_name(rule->name()),
+ m_enabled(rule->isEnabled())
+{
+ // Copy conditions
+ const ConditionChain *conditionList = rule->conditions();
+ m_conditionChain.setType(conditionList->type());
+
+ ConditionChain::ConstIterator cle = conditionList->end();
+ for (ConditionChain::ConstIterator i = conditionList->begin(); i != cle; ++i) {
+ const Condition *c = (*i);
+
+ m_conditionChain.append(new Condition(c->field(), c->type(), c->value()));
+ }
+
+ // Copy actions
+ const ActionChain *actionList = rule->actions();
+
+ ActionChain::ConstIterator ale = actionList->end();
+ for (ActionChain::ConstIterator i = actionList->begin(); i != ale; ++i) {
+ const Action *a = (*i);
+
+ m_actionChain.append(new Action(a->type(), a->value()));
+ }
+}
+
+Rule::Rule(const QString &name)
+ : m_name(name),
+ m_enabled(true)
+{
+ // Add a simple condition and a simple action
+ m_conditionChain.append(new Condition(Filename, Condition::Contains, QVariant("")));
+ m_actionChain.append(new Action(Action::None, QVariant()));
+}
+
+Filters *Filters::m_self = 0;
+static KStaticDeleter<Filters> staticFiltersDeleter;
+
+Filters *Filters::self()
+{
+ if (!m_self) {
+ staticFiltersDeleter.setObject(m_self, new Filters());
+ }
+
+ return m_self;
+}
+
+Filters::Filters()
+ : QPtrList<Rule>(),
+ m_enabled(true)
+{
+ setAutoDelete(true);
+
+ // Generate human readable strings
+ m_fieldNames << i18n("Filename");
+ m_fieldNames << i18n("Entry Type");
+ m_fieldNames << i18n("Size");
+
+ m_actionNames << " ";
+ m_actionNames << i18n("Change priority");
+ m_actionNames << i18n("Skip when queuing");
+ m_actionNames << i18n("Colorize in list view");
+ m_actionNames << i18n("Hide from list view");
+ m_actionNames << i18n("Lowercase destination");
+
+ // Load the filters
+ load();
+}
+
+Filters::~Filters()
+{
+ if (m_self == this)
+ staticFiltersDeleter.setObject(m_self, 0, false);
+}
+
+void Filters::save()
+{
+ int num = 0;
+ KConfig *config = kapp->config();
+
+ config->setGroup("Filters");
+ config->writeEntry("count", count());
+
+ // Remove any existing sections
+ for (int i = 0; ; i++) {
+ QString groupName = QString("Filter #%1").arg(i);
+
+ if (config->hasGroup(groupName))
+ config->deleteGroup(groupName);
+ else
+ break;
+ }
+
+ Filters::ConstIterator le = end();
+ for (Filters::ConstIterator i = begin(); i != le; ++i, num++) {
+ const Rule *rule = (*i);
+
+ config->setGroup(QString("Filter #%1").arg(num));
+ config->writeEntry("name", rule->name());
+ config->writeEntry("enabled", rule->isEnabled());
+
+ // Write conditions
+ int cnum = 0;
+ const ConditionChain *conditions = rule->conditions();
+ config->writeEntry("conditions", conditions->count());
+ config->writeEntry("conditions-type", (int) conditions->type());
+
+ ConditionChain::ConstIterator cle = conditions->end();
+ for (ConditionChain::ConstIterator j = conditions->begin(); j != cle; ++j, cnum++) {
+ const Condition *c = (*j);
+ QString prefix = QString("condition%1-").arg(cnum);
+
+ config->writeEntry(prefix + "field", (int) c->field());
+ config->writeEntry(prefix + "type", (int) c->type());
+ config->writeEntry(prefix + "value", c->value());
+ config->writeEntry(prefix + "valueType", (int) c->value().type());
+ }
+
+ // Write actions
+ int anum = 0;
+ const ActionChain *actions = rule->actions();
+ config->writeEntry("actions", actions->count());
+
+ ActionChain::ConstIterator ale = actions->end();
+ for (ActionChain::ConstIterator j = actions->begin(); j != ale; ++j, anum++) {
+ const Action *a = (*j);
+ QString prefix = QString("action%1-").arg(anum);
+
+ config->writeEntry(prefix + "type", (int) a->type());
+ config->writeEntry(prefix + "value", a->value());
+ config->writeEntry(prefix + "valueType", (int) a->value().type());
+ }
+ }
+}
+
+void Filters::load()
+{
+ int num = 0;
+ KConfig *config = kapp->config();
+
+ config->setGroup("Filters");
+ num = config->readNumEntry("count");
+
+ for (int i = 0; i < num; i++) {
+ Rule *rule = new Rule();
+
+ config->setGroup(QString("Filter #%1").arg(i));
+ rule->setName(config->readEntry("name", i18n("Unnamed Rule")));
+ rule->setEnabled(config->readBoolEntry("enabled", true));
+
+ // Read conditions
+ ConditionChain *conditions = const_cast<ConditionChain*>(rule->conditions());
+ int cnum = config->readNumEntry("conditions");
+ conditions->setType((ConditionChain::Type) config->readNumEntry("conditions-type"));
+
+ for (int j = 0; j < cnum; j++) {
+ QString prefix = QString("condition%1-").arg(j);
+
+ conditions->append(new Condition((Field) config->readNumEntry(prefix + "field"),
+ (Condition::Type) config->readNumEntry(prefix + "type"),
+ config->readPropertyEntry(prefix + "value",
+ (QVariant::Type) config->readNumEntry(prefix + "valueType"))));
+ }
+
+ // Read actions
+ ActionChain *actions = const_cast<ActionChain*>(rule->actions());
+ int anum = config->readNumEntry("actions");
+
+ for (int j = 0; j < anum; j++) {
+ QString prefix = QString("action%1-").arg(j);
+
+ actions->append(new Action((Action::Type) config->readNumEntry(prefix + "type"),
+ config->readPropertyEntry(prefix + "value",
+ (QVariant::Type) config->readNumEntry(prefix + "valueType"))));
+ }
+
+ append(rule);
+ }
+}
+
+const ActionChain *Filters::process(const KFTPEngine::DirectoryEntry &entry) const
+{
+ if (m_enabled) {
+ QPtrList<Rule>::ConstIterator le = end();
+ for (QPtrList<Rule>::ConstIterator i = begin(); i != le; ++i) {
+ const Rule *rule = (*i);
+
+ if (rule->isEnabled() && rule->conditions()->matches(entry))
+ return rule->actions();
+ }
+ }
+
+ // Nothing has matched
+ return 0;
+}
+
+const Action *Filters::process(const KFTPEngine::DirectoryEntry &entry, QValueList<Action::Type> types) const
+{
+ const ActionChain *chain = process(entry);
+
+ if (!chain || chain->isEmpty())
+ return 0;
+
+ // Find an action that matches the filter
+ ActionChain::ConstIterator le = chain->end();
+ for (ActionChain::ConstIterator i = chain->begin(); i != le; ++i) {
+ if (types.contains((*i)->type()))
+ return (*i);
+ }
+
+ return 0;
+}
+
+const Action *Filters::process(const KFTPEngine::DirectoryEntry &entry, Action::Type filter) const
+{
+ const ActionChain *chain = process(entry);
+
+ if (!chain || chain->isEmpty())
+ return 0;
+
+ // Find an action that matches the filter
+ ActionChain::ConstIterator le = chain->end();
+ for (ActionChain::ConstIterator i = chain->begin(); i != le; ++i) {
+ if ((*i)->type() == filter)
+ return (*i);
+ }
+
+ return 0;
+}
+
+const Action *Filters::process(const KURL &url, filesize_t size, bool directory, Action::Type filter) const
+{
+ KFTPEngine::DirectoryEntry entry;
+ entry.setFilename(url.filename());
+ entry.setSize(size);
+ entry.setType(directory ? 'd' : 'f');
+
+ return process(entry, filter);
+}
+
+const ActionChain *Filters::process(const KURL &url, filesize_t size, bool directory) const
+{
+ KFTPEngine::DirectoryEntry entry;
+ entry.setFilename(url.filename());
+ entry.setSize(size);
+ entry.setType(directory ? 'd' : 'f');
+
+ return process(entry);
+}
+
+const Action *Filters::process(const KURL &url, Action::Type filter) const
+{
+ return process(url, 0, false, filter);
+}
+
+}
+
+}
diff --git a/kftpgrabber/src/misc/filter.h b/kftpgrabber/src/misc/filter.h
new file mode 100644
index 0000000..8c7ac36
--- /dev/null
+++ b/kftpgrabber/src/misc/filter.h
@@ -0,0 +1,506 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_FILTERFILTERS_H
+#define KFTPCORE_FILTERFILTERS_H
+
+#include <qvariant.h>
+#include <qvaluelist.h>
+
+#include "engine/directorylisting.h"
+
+namespace KFTPCore {
+
+namespace Filter {
+
+/**
+ * Possible filter fields.
+ */
+enum Field {
+ Filename = 0,
+ EntryType = 1,
+ Size = 2
+};
+
+/**
+ * A filter condition class of different types.
+ *
+ * @author Jernej Kos
+ */
+class Condition {
+public:
+ /**
+ * Condition type.
+ *
+ * The following types are valid:
+ * - None: this rule never validates
+ * - Contains: field contains a given substring
+ * - ContainsNot: field does not contain a given substring
+ * - Is: field is equal to the given value
+ * - IsNot: field is not equal to the given value
+ * - Matches: field matches a given regular expression
+ * - MatchesNot: field doesn't match a given regular expression
+ * - Greater: field's integer value is greater than the given value
+ * - Smaller: field's integer value is smaller than the given value
+ */
+ enum Type {
+ None = -1,
+ Contains = 0,
+ ContainsNot = 1,
+ Is = 2,
+ IsNot = 3,
+ Matches = 4,
+ MatchesNot = 5,
+ Greater = 6,
+ Smaller = 7
+ };
+
+ /**
+ * Class constructor. The constructed condition is invalid.
+ */
+ Condition() {}
+
+ /**
+ * Class constructor.
+ *
+ * @param field Field to check
+ * @param type Condition type
+ * @param value Value to check against
+ */
+ Condition(Field field, Type type, const QVariant &value);
+
+ /**
+ * Returns the field this condition operates on.
+ */
+ Field field() const { return m_field; }
+
+ /**
+ * Set condition field.
+ *
+ * @param field A valid condition field
+ */
+ void setField(Field field) { m_field = field; }
+
+ /**
+ * Returns the type of this condition.
+ */
+ Type type() const { return m_type; }
+
+ /**
+ * Set condition type.
+ *
+ * @param type A valid condition type
+ */
+ void setType(Type type) { m_type = type; }
+
+ /**
+ * Returns the value this condition validates the field with.
+ */
+ QVariant value() const { return m_value; }
+
+ /**
+ * Set condition validation value.
+ *
+ * @param value A valid validation value
+ */
+ void setValue(const QVariant &value) { m_value = value; }
+
+ /**
+ * Does the specified entry match this condition ?
+ *
+ * @param entry Directory entry to compare
+ * @return True if the entry matches this condition, false otherwise
+ */
+ bool matches(const KFTPEngine::DirectoryEntry &entry) const;
+private:
+ Field m_field;
+ Type m_type;
+ QVariant m_value;
+};
+
+/**
+ * This class represents a chain of filter conditions.
+ *
+ * @author Jernej Kos
+ */
+class ConditionChain : public QPtrList<Condition> {
+public:
+ /**
+ * Chain type.
+ *
+ * The following types are valid:
+ * - All: all conditions must match
+ * - Any: any condition can match
+ */
+ enum Type {
+ All = 0,
+ Any = 1
+ };
+
+ /**
+ * Class constructor.
+ */
+ ConditionChain();
+
+ /**
+ * Class constructor.
+ */
+ ConditionChain(Type type);
+
+ /**
+ * Returns condition chain match type.
+ */
+ Type type() const { return m_type; }
+
+ /**
+ * Set condition chain match type.
+ *
+ * @param type A valid type
+ */
+ void setType(Type type) { m_type = type; }
+
+ /**
+ * Does the specified entry match this condition chain ? The actual
+ * matching depends on chain type.
+ *
+ * @param entry Directory entry to compare
+ * @return True if the entry matches this chain, false otherwise
+ */
+ bool matches(const KFTPEngine::DirectoryEntry &entry) const;
+private:
+ Type m_type;
+};
+
+/**
+ * This class represents a single action to take.
+ */
+class Action {
+public:
+ /**
+ * Action type.
+ *
+ * These are the valid types:
+ * - Priority: when queuing files, their priority should be changed
+ * - Skip: do not queue such files
+ * - Colorize: change font color in the list view
+ * - Hide: do not display such files in the list view
+ * - Lowercase: lowercase the destination filename when queuing
+ */
+ enum Type {
+ None = 0,
+ Priority = 1,
+ Skip = 2,
+ Colorize = 3,
+ Hide = 4,
+ Lowercase = 5
+ };
+
+ /**
+ * Class constructor. The resulting action is invalid.
+ */
+ Action();
+
+ /**
+ * Class constructor.
+ *
+ * @param type Action type
+ * @param value Action parameters
+ */
+ Action(Type type, const QVariant &value);
+
+ /**
+ * Returns true if the action is valid.
+ */
+ bool isValid() const { return m_valid; }
+
+ /**
+ * Get action's type.
+ */
+ Type type() const { return m_type; }
+
+ /**
+ * Set the action type.
+ *
+ * @param type A valid action type
+ */
+ void setType(Type type) { m_type = type; }
+
+ /**
+ * Get action's parameters.
+ */
+ QVariant value() const { return m_value; }
+
+ /**
+ * Set action parameter.
+ *
+ * @param value Parameter value
+ */
+ void setValue(const QVariant &value) { m_value = value; }
+private:
+ bool m_valid;
+ Type m_type;
+ QVariant m_value;
+};
+
+/**
+ * This class represents a chain of filter actions.
+ *
+ * @author Jernej Kos
+ */
+class ActionChain : public QPtrList<Action> {
+public:
+ /**
+ * Class constructor.
+ */
+ ActionChain();
+
+ /**
+ * Get an action of the specified type.
+ *
+ * @param type Action type to search for
+ * @return A valid Action or null if there is none
+ */
+ const Action *getAction(Action::Type type) const;
+};
+
+/**
+ * This class represents a single filter rule consiting of a condition chain
+ * and an action chain.
+ *
+ * @author Jernej Kos
+ */
+class Rule {
+public:
+ /**
+ * Class constructor.
+ */
+ Rule();
+
+ /**
+ * Class copy constructor. Creates a duplicate deep copy of the provided
+ * rule.
+ *
+ * @param rule The rule to copy
+ */
+ Rule(const Rule *rule);
+
+ /**
+ * Class constructor.
+ *
+ * @param name Human readable rule name
+ */
+ Rule(const QString &name);
+
+ /**
+ * Get rule's name.
+ */
+ QString name() const { return m_name; }
+
+ /**
+ * Set rule's name.
+ */
+ void setName(const QString &name) { m_name = name; }
+
+ /**
+ * Is this rule enabled or not ?
+ *
+ * @return True if the rule is enabled, false otherwise
+ */
+ bool isEnabled() const { return m_enabled; }
+
+ /**
+ * Enable or disable this rule.
+ *
+ * @param value True if the rule is enabled, false otherwise
+ */
+ void setEnabled(bool value) { m_enabled = value; }
+
+ /**
+ * Get the condition chain reference.
+ */
+ const ConditionChain *conditions() const { return &m_conditionChain; }
+
+ /**
+ * Get the action chain reference.
+ */
+ const ActionChain *actions() const { return &m_actionChain; }
+private:
+ QString m_name;
+ bool m_enabled;
+ ConditionChain m_conditionChain;
+ ActionChain m_actionChain;
+};
+
+/**
+ * This class contains all the currently loaded rules.
+ *
+ * @author Jernej Kos
+ */
+class Filters : public QPtrList<Rule> {
+public:
+ /**
+ * Get the global rule chain.
+ */
+ static Filters *self();
+
+ /**
+ * Class destructor.
+ */
+ ~Filters();
+
+ /**
+ * Load the rules from a file.
+ */
+ void load();
+
+ /**
+ * Serialize the rules and save them to a file.
+ */
+ void save();
+
+ /**
+ * Is filtering enabled or not ?
+ *
+ * @return True if filtering is enabled, false otherwise
+ */
+ bool isEnabled() const { return m_enabled; }
+
+ /**
+ * Enable or disable filtering.
+ *
+ * @param value True if filtering is enabled, false otherwise
+ */
+ void setEnabled(bool value) { m_enabled = value; }
+
+ /**
+ * Process the specified entry and return an action chain that matched
+ * first.
+ *
+ * @param entry The entry to process
+ * @return An ActionChain reference (might be empty if nothing matched)
+ */
+ const ActionChain *process(const KFTPEngine::DirectoryEntry &entry) const;
+
+ /**
+ * Process the specified entry and return an action to use. This will
+ * go trough all loaded rules and attempt to process each one by one.
+ * The first one that succeeds is returned.
+ *
+ * @param entry The entry to process
+ * @param types Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KFTPEngine::DirectoryEntry &entry, QValueList<Action::Type> types) const;
+
+ /**
+ * Process the specified entry and return an action to use. This will
+ * go trough all loaded rules and attempt to process each one by one.
+ * The first one that succeeds is returned.
+ *
+ * @param entry The entry to process
+ * @param filter Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KFTPEngine::DirectoryEntry &entry, Action::Type filter) const;
+
+ /**
+ * This method is provided for convienience. It behaves just like the
+ * above method.
+ *
+ * @param url File's URL
+ * @param size File's size
+ * @param directory True if the entry is a directory
+ * @param filter Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KURL &url, filesize_t size, bool directory, Action::Type filter) const;
+
+ /**
+ * Process the specified entry and return an action chain that matched
+ * first.
+ *
+ * @param url File's URL
+ * @param size File's size
+ * @param directory True if the entry is a directory
+ * @return An ActionChain reference (might be invalid if nothing matched)
+ */
+ const ActionChain *process(const KURL &url, filesize_t size, bool directory) const;
+
+ /**
+ * This method is provided for convienience. It behaves just like the
+ * above method.
+ *
+ * Note that 0 will be used for filesize and this may affect the filter
+ * process!
+ *
+ * @param url File's URL
+ * @param filter Only return the action of this type
+ * @return An Action reference (might be invalid if nothing matched)
+ */
+ const Action *process(const KURL &url, Action::Type filter) const;
+
+ /**
+ * Get a human readable list of possible field names.
+ *
+ * @return A QStringList representing the field names
+ */
+ const QStringList &getFieldNames() { return m_fieldNames; }
+
+ /**
+ * Get a human readable list of possible action names
+ *
+ * @return A QStringList representing the action names
+ */
+ const QStringList &getActionNames() { return m_actionNames; }
+protected:
+ /**
+ * Class constructor.
+ */
+ Filters();
+private:
+ static Filters *m_self;
+
+ bool m_enabled;
+ ActionChain m_emptyActionChain;
+
+ QStringList m_fieldNames;
+ QStringList m_actionNames;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/filterwidgethandler.cpp b/kftpgrabber/src/misc/filterwidgethandler.cpp
new file mode 100644
index 0000000..6fa368d
--- /dev/null
+++ b/kftpgrabber/src/misc/filterwidgethandler.cpp
@@ -0,0 +1,539 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "filterwidgethandler.h"
+
+#include <qcombobox.h>
+#include <qlabel.h>
+
+#include <klocale.h>
+#include <kstaticdeleter.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kcolorbutton.h>
+
+namespace KFTPCore {
+
+namespace Filter {
+
+namespace {
+
+static const struct {
+ const Condition::Type type;
+ const char *name;
+} TextTypes[] = {
+ { Condition::Contains, I18N_NOOP("contains") },
+ { Condition::ContainsNot, I18N_NOOP("does not contain") },
+ { Condition::Is, I18N_NOOP("equals") },
+ { Condition::IsNot, I18N_NOOP("does not equal") },
+ { Condition::Matches, I18N_NOOP("matches regexp") },
+ { Condition::MatchesNot, I18N_NOOP("does not match regexp") }
+};
+
+static const int TextTypeCount = sizeof(TextTypes) / sizeof(*TextTypes);
+
+class TextWidgetHandler : public ConditionWidgetHandler
+{
+public:
+ TextWidgetHandler()
+ : ConditionWidgetHandler()
+ {
+ }
+
+ QWidget *createTypeWidget(QWidget *parent, const QObject *receiver) const
+ {
+ QComboBox *combo = new QComboBox(parent);
+
+ for (int i = 0; i < TextTypeCount; i++) {
+ combo->insertItem(i18n(TextTypes[i].name));
+ }
+
+ combo->adjustSize();
+
+ // Connect the signal
+ QObject::connect(combo, SIGNAL(activated(int)), receiver, SLOT(slotTypeChanged()));
+
+ return combo;
+ }
+
+ Condition::Type getConditionType(QWidget *widget) const
+ {
+ QComboBox *combo = static_cast<QComboBox*>(widget);
+ return TextTypes[combo->currentItem()].type;
+ }
+
+ void createValueWidgets(QWidgetStack *stack, const QObject *receiver) const
+ {
+ KLineEdit *lineEdit = new KLineEdit(stack, "textWidgetHandler_LineEdit");
+ QObject::connect(lineEdit, SIGNAL(textChanged(const QString&)), receiver, SLOT(slotValueChanged()));
+ stack->addWidget(lineEdit);
+ }
+
+ QVariant getConditionValue(QWidgetStack *values) const
+ {
+ KLineEdit *lineEdit = static_cast<KLineEdit*>(values->child("textWidgetHandler_LineEdit"));
+ return QVariant(lineEdit->text());
+ }
+
+ void update(int field, QWidgetStack *types, QWidgetStack *values) const
+ {
+ types->raiseWidget(field);
+ values->raiseWidget((QWidget*) values->child("textWidgetHandler_LineEdit"));
+ }
+
+ void setCondition(QWidgetStack *types, QWidgetStack *values, const Condition *condition)
+ {
+ // Set condition type
+ const Condition::Type type = condition->type();
+ int typeIndex = 0;
+
+ for (; typeIndex < TextTypeCount; typeIndex++)
+ if (type == TextTypes[typeIndex].type)
+ break;
+
+ QComboBox *combo = static_cast<QComboBox*>(types->widget(((int) condition->field())));
+ combo->blockSignals(true);
+ combo->setCurrentItem(typeIndex);
+ combo->blockSignals(false);
+ types->raiseWidget(combo);
+
+ // Set condition value
+ KLineEdit *lineEdit = static_cast<KLineEdit*>(values->child("textWidgetHandler_LineEdit"));
+ lineEdit->blockSignals(true);
+ lineEdit->setText(condition->value().toString());
+ lineEdit->blockSignals(false);
+ values->raiseWidget(lineEdit);
+ }
+};
+
+}
+
+namespace {
+
+static const struct {
+ const Condition::Type type;
+ const char *name;
+} EntryTypes[] = {
+ { Condition::Is, I18N_NOOP("is") },
+ { Condition::IsNot, I18N_NOOP("is not") }
+};
+
+static const int EntryTypeCount = sizeof(EntryTypes) / sizeof(*EntryTypes);
+
+class EntryWidgetHandler : public ConditionWidgetHandler
+{
+public:
+ EntryWidgetHandler()
+ : ConditionWidgetHandler()
+ {
+ }
+
+ QWidget *createTypeWidget(QWidget *parent, const QObject *receiver) const
+ {
+ QComboBox *combo = new QComboBox(parent);
+
+ for (int i = 0; i < EntryTypeCount; i++) {
+ combo->insertItem(i18n(EntryTypes[i].name));
+ }
+
+ combo->adjustSize();
+
+ // Connect the signal
+ QObject::connect(combo, SIGNAL(activated(int)), receiver, SLOT(slotTypeChanged()));
+
+ return combo;
+ }
+
+ Condition::Type getConditionType(QWidget *widget) const
+ {
+ QComboBox *combo = static_cast<QComboBox*>(widget);
+ return EntryTypes[combo->currentItem()].type;
+ }
+
+ void createValueWidgets(QWidgetStack *stack, const QObject *receiver) const
+ {
+ QComboBox *combo = new QComboBox(stack, "entryWidgetHandler_Combo");
+ combo->insertItem(i18n("File"), 0);
+ combo->insertItem(i18n("Directory"), 1);
+
+ QObject::connect(combo, SIGNAL(activated(int)), receiver, SLOT(slotValueChanged()));
+ stack->addWidget(combo);
+ }
+
+ QVariant getConditionValue(QWidgetStack *values) const
+ {
+ QComboBox *combo = static_cast<QComboBox*>(values->child("entryWidgetHandler_Combo"));
+ QVariant value;
+
+ if (combo->currentItem() == 0)
+ value = QVariant(QString("f"));
+ else
+ value = QVariant(QString("d"));
+
+ return value;
+ }
+
+ void update(int field, QWidgetStack *types, QWidgetStack *values) const
+ {
+ types->raiseWidget(field);
+ values->raiseWidget((QWidget*) values->child("entryWidgetHandler_Combo"));
+ }
+
+ void setCondition(QWidgetStack *types, QWidgetStack *values, const Condition *condition)
+ {
+ // Set condition type
+ const Condition::Type type = condition->type();
+ int typeIndex = 0;
+
+ for (; typeIndex < EntryTypeCount; typeIndex++)
+ if (type == EntryTypes[typeIndex].type)
+ break;
+
+ QComboBox *combo = static_cast<QComboBox*>(types->widget(((int) condition->field())));
+ combo->blockSignals(true);
+ combo->setCurrentItem(typeIndex);
+ combo->blockSignals(false);
+ types->raiseWidget(combo);
+
+ // Set condition value
+ combo = static_cast<QComboBox*>(values->child("entryWidgetHandler_Combo"));
+ combo->blockSignals(true);
+ combo->setCurrentItem(condition->value().toString() == "f" ? 0 : 1);
+ combo->blockSignals(false);
+ values->raiseWidget(combo);
+ }
+};
+
+}
+
+namespace {
+
+static const struct {
+ const Condition::Type type;
+ const char *name;
+} SizeTypes[] = {
+ { Condition::Is, I18N_NOOP("equals") },
+ { Condition::IsNot, I18N_NOOP("does not equal") },
+ { Condition::Greater, I18N_NOOP("is greater than") },
+ { Condition::Smaller, I18N_NOOP("is smaller than") }
+};
+
+static const int SizeTypeCount = sizeof(SizeTypes) / sizeof(*SizeTypes);
+
+class SizeWidgetHandler : public ConditionWidgetHandler
+{
+public:
+ SizeWidgetHandler()
+ : ConditionWidgetHandler()
+ {
+ }
+
+ QWidget *createTypeWidget(QWidget *parent, const QObject *receiver) const
+ {
+ QComboBox *combo = new QComboBox(parent);
+
+ for (int i = 0; i < SizeTypeCount; i++) {
+ combo->insertItem(i18n(SizeTypes[i].name));
+ }
+
+ combo->adjustSize();
+
+ // Connect the signal
+ QObject::connect(combo, SIGNAL(activated(int)), receiver, SLOT(slotTypeChanged()));
+
+ return combo;
+ }
+
+ Condition::Type getConditionType(QWidget *widget) const
+ {
+ QComboBox *combo = static_cast<QComboBox*>(widget);
+ return SizeTypes[combo->currentItem()].type;
+ }
+
+ void createValueWidgets(QWidgetStack *stack, const QObject *receiver) const
+ {
+ KIntNumInput *numInput = new KIntNumInput(stack, "sizeWidgetHandler_NumInput");
+ numInput->setMinValue(0);
+ numInput->setSuffix(" " + i18n("bytes"));
+
+ QObject::connect(numInput, SIGNAL(valueChanged(int)), receiver, SLOT(slotValueChanged()));
+ stack->addWidget(numInput);
+ }
+
+ QVariant getConditionValue(QWidgetStack *values) const
+ {
+ KIntNumInput *numInput = static_cast<KIntNumInput*>(values->child("sizeWidgetHandler_NumInput"));
+ return QVariant(numInput->value());
+ }
+
+ void update(int field, QWidgetStack *types, QWidgetStack *values) const
+ {
+ types->raiseWidget(field);
+ values->raiseWidget((QWidget*) values->child("sizeWidgetHandler_NumInput"));
+ }
+
+ void setCondition(QWidgetStack *types, QWidgetStack *values, const Condition *condition)
+ {
+ // Set condition type
+ const Condition::Type type = condition->type();
+ int typeIndex = 0;
+
+ for (; typeIndex < SizeTypeCount; typeIndex++)
+ if (type == SizeTypes[typeIndex].type)
+ break;
+
+ QComboBox *combo = static_cast<QComboBox*>(types->widget(((int) condition->field())));
+ combo->blockSignals(true);
+ combo->setCurrentItem(typeIndex);
+ combo->blockSignals(false);
+ types->raiseWidget(combo);
+
+ // Set condition value
+ KIntNumInput *numInput = static_cast<KIntNumInput*>(values->child("sizeWidgetHandler_NumInput"));
+ numInput->blockSignals(true);
+ numInput->setValue(condition->value().toInt());
+ numInput->blockSignals(false);
+ values->raiseWidget(numInput);
+ }
+};
+
+}
+
+class EmptyActionWidgetHandler : public ActionWidgetHandler
+{
+public:
+ EmptyActionWidgetHandler()
+ : ActionWidgetHandler()
+ {
+ }
+
+ virtual QWidget *createWidget(QWidget *parent, const QObject *receiver) const
+ {
+ Q_UNUSED(receiver);
+
+ return new QWidget(parent);
+ }
+
+ QVariant getActionValue(QWidget *widget) const
+ {
+ Q_UNUSED(widget);
+
+ return QVariant(QString());
+ }
+
+ void setAction(QWidgetStack *stack, const Action *action) const
+ {
+ stack->raiseWidget((int) action->type());
+ }
+};
+
+class NoneActionWidgetHandler : public EmptyActionWidgetHandler
+{
+public:
+ NoneActionWidgetHandler()
+ : EmptyActionWidgetHandler()
+ {
+ }
+
+ QWidget *createWidget(QWidget *parent, const QObject *receiver) const
+ {
+ Q_UNUSED(receiver);
+
+ return new QLabel(i18n("Please select an action."), parent);
+ }
+};
+
+class PriorityActionWidgetHandler : public ActionWidgetHandler
+{
+public:
+ PriorityActionWidgetHandler()
+ : ActionWidgetHandler()
+ {
+ }
+
+ QWidget *createWidget(QWidget *parent, const QObject *receiver) const
+ {
+ KIntNumInput *numInput = new KIntNumInput(parent);
+ numInput->setPrefix(i18n("Priority:") + " ");
+
+ QObject::connect(numInput, SIGNAL(valueChanged(int)), receiver, SLOT(slotValueChanged()));
+ return numInput;
+ }
+
+ QVariant getActionValue(QWidget *widget) const
+ {
+ KIntNumInput *numInput = static_cast<KIntNumInput*>(widget);
+ return QVariant(numInput->value());
+ }
+
+ void setAction(QWidgetStack *stack, const Action *action) const
+ {
+ stack->raiseWidget((int) action->type());
+ KIntNumInput *numInput = static_cast<KIntNumInput*>(stack->visibleWidget());
+ numInput->setValue(action->value().toInt());
+ }
+};
+
+class ColorizeActionWidgetHandler : public ActionWidgetHandler
+{
+public:
+ ColorizeActionWidgetHandler()
+ : ActionWidgetHandler()
+ {
+ }
+
+ QWidget *createWidget(QWidget *parent, const QObject *receiver) const
+ {
+ KColorButton *colorButton = new KColorButton(parent);
+
+ QObject::connect(colorButton, SIGNAL(changed(const QColor&)), receiver, SLOT(slotValueChanged()));
+ return colorButton;
+ }
+
+ QVariant getActionValue(QWidget *widget) const
+ {
+ KColorButton *colorButton = static_cast<KColorButton*>(widget);
+ return QVariant(colorButton->color());
+ }
+
+ void setAction(QWidgetStack *stack, const Action *action) const
+ {
+ stack->raiseWidget((int) action->type());
+ KColorButton *colorButton = static_cast<KColorButton*>(stack->visibleWidget());
+ colorButton->setColor(action->value().toColor());
+ }
+};
+
+WidgetHandlerManager *WidgetHandlerManager::m_self = 0;
+static KStaticDeleter<WidgetHandlerManager> staticHandlerManagerDeleter;
+
+WidgetHandlerManager *WidgetHandlerManager::self()
+{
+ if (!m_self) {
+ staticHandlerManagerDeleter.setObject(m_self, new WidgetHandlerManager());
+ }
+
+ return m_self;
+}
+
+WidgetHandlerManager::WidgetHandlerManager()
+{
+ // Register condition handlers
+ registerConditionHandler(Filename, new TextWidgetHandler());
+ registerConditionHandler(EntryType, new EntryWidgetHandler());
+ registerConditionHandler(Size, new SizeWidgetHandler());
+
+ // Register action handlers
+ registerActionHandler(Action::None, new NoneActionWidgetHandler());
+ registerActionHandler(Action::Priority, new PriorityActionWidgetHandler());
+ registerActionHandler(Action::Skip, new EmptyActionWidgetHandler());
+ registerActionHandler(Action::Colorize, new ColorizeActionWidgetHandler());
+ registerActionHandler(Action::Hide, new EmptyActionWidgetHandler());
+ registerActionHandler(Action::Lowercase, new EmptyActionWidgetHandler());
+}
+
+WidgetHandlerManager::~WidgetHandlerManager()
+{
+ if (m_self == this)
+ staticHandlerManagerDeleter.setObject(m_self, 0, false);
+}
+
+void WidgetHandlerManager::registerConditionHandler(Field field, ConditionWidgetHandler *handler)
+{
+ m_conditionHandlers[field] = handler;
+}
+
+void WidgetHandlerManager::registerActionHandler(Action::Type type, ActionWidgetHandler *handler)
+{
+ m_actionHandlers[type] = handler;
+}
+
+void WidgetHandlerManager::createConditionWidgets(QWidgetStack *types, QWidgetStack *values, const QObject *receiver)
+{
+ ConditionHandlerMap::ConstIterator le = m_conditionHandlers.end();
+ for (ConditionHandlerMap::ConstIterator i = m_conditionHandlers.begin(); i != le; ++i) {
+ Field field = i.key();
+ const ConditionWidgetHandler *handler = i.data();
+
+ types->addWidget(handler->createTypeWidget(types, receiver), (int) field);
+ handler->createValueWidgets(values, receiver);
+ }
+}
+
+void WidgetHandlerManager::createActionWidgets(QWidgetStack *stack, const QObject *receiver)
+{
+ ActionHandlerMap::ConstIterator le = m_actionHandlers.end();
+ for (ActionHandlerMap::ConstIterator i = m_actionHandlers.begin(); i != le; ++i) {
+ Action::Type type = i.key();
+ const ActionWidgetHandler *handler = i.data();
+
+ stack->addWidget(handler->createWidget(stack, receiver), (int) type);
+ }
+}
+
+void WidgetHandlerManager::update(Field field, QWidgetStack *types, QWidgetStack *values)
+{
+ m_conditionHandlers[field]->update((int) field, types, values);
+}
+
+void WidgetHandlerManager::setCondition(QWidgetStack *types, QWidgetStack *values, const Condition *condition)
+{
+ m_conditionHandlers[condition->field()]->setCondition(types, values, condition);
+}
+
+Condition::Type WidgetHandlerManager::getConditionType(Field field, QWidgetStack *types)
+{
+ return m_conditionHandlers[field]->getConditionType(types->widget((int) field));
+}
+
+QVariant WidgetHandlerManager::getConditionValue(Field field, QWidgetStack *values)
+{
+ return m_conditionHandlers[field]->getConditionValue(values);
+}
+
+void WidgetHandlerManager::setAction(QWidgetStack *stack, const Action *action)
+{
+ m_actionHandlers[action->type()]->setAction(stack, action);
+}
+
+QVariant WidgetHandlerManager::getActionValue(QWidgetStack *stack)
+{
+ QWidget *widget = stack->visibleWidget();
+ return m_actionHandlers[(Action::Type) stack->id(widget)]->getActionValue(widget);
+}
+
+}
+
+}
diff --git a/kftpgrabber/src/misc/filterwidgethandler.h b/kftpgrabber/src/misc/filterwidgethandler.h
new file mode 100644
index 0000000..5ea6376
--- /dev/null
+++ b/kftpgrabber/src/misc/filterwidgethandler.h
@@ -0,0 +1,279 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCORE_FILTERFILTERWIDGETHANDLER_H
+#define KFTPCORE_FILTERFILTERWIDGETHANDLER_H
+
+#include "filter.h"
+
+#include <qmap.h>
+#include <qwidget.h>
+#include <qwidgetstack.h>
+
+namespace KFTPCore {
+
+namespace Filter {
+
+/**
+ * This is an interface that any condition widget handlers must implement
+ * in order to be registred with the manager. The handler handles several
+ * widgets at once so it should not keep any member variables.
+ *
+ * @author Jernej Kos
+ */
+class ConditionWidgetHandler {
+public:
+ /**
+ * This method has to return a new widget used for displaying condition
+ * types. It is usually a combobox with several options. The returned
+ * widget is added to the value widget stack.
+ *
+ * @param parent Widget to be used as parent for the newly created widget
+ * @param receiver Object that receives type change notifications
+ * @return A valid QWidget instance
+ */
+ virtual QWidget *createTypeWidget(QWidget *parent, const QObject *receiver) const = 0;
+
+ /**
+ * This method has to create one or several input widgets for different
+ * condition types. Each widget has to be added to the widget stack. An
+ * identifying widget name is recommended for each widget, so you can easily
+ * access it from other methods which get the value stack widget passed as
+ * an argument.
+ *
+ * @param stack Value widget stack
+ * @param receiver Object that receives value change notifications
+ */
+ virtual void createValueWidgets(QWidgetStack *stack, const QObject *receiver) const = 0;
+
+ /**
+ * Update the status of all widgets.
+ *
+ * @param field The field to display
+ * @param types Type widget stack to use
+ * @param values Value widget stack to use
+ */
+ virtual void update(int field, QWidgetStack *types, QWidgetStack *values) const = 0;
+
+ /**
+ * Extract data from internal condition representation and show it to the
+ * user using the created widgets.
+ *
+ * @param types Type widget stack to use
+ * @param values Value widget stack to use
+ * @param condition The condition representation
+ */
+ virtual void setCondition(QWidgetStack *types, QWidgetStack *values, const Condition *condition) = 0;
+
+ /**
+ * This method should return the currently selected condition type.
+ *
+ * @param widget The type widget previously created
+ * @return A valid Condition::Type
+ */
+ virtual Condition::Type getConditionType(QWidget *widget) const = 0;
+
+ /**
+ * This method should return the current condition value.
+ *
+ * @param values Value widget stack to use
+ * @return A valid condition value
+ */
+ virtual QVariant getConditionValue(QWidgetStack *values) const = 0;
+};
+
+/**
+ * This is an interface that any action widget handlers must implement
+ * in order to be registred with the manager. The handler handles several
+ * widgets at once so it should not keep any member variables.
+ *
+ * @author Jernej Kos
+ */
+class ActionWidgetHandler {
+public:
+ /**
+ * This method has to return a new widget used for displaying the action
+ * value. It is usually a line edit or a similar input widget. The returned
+ * widget is added to the value widget stack.
+ *
+ * @param parent Widget to be used as parent for the newly created widget
+ * @param receiver Object that receives type change notifications
+ * @return A valid QWidget instance
+ */
+ virtual QWidget *createWidget(QWidget *parent, const QObject *receiver) const = 0;
+
+ /**
+ * Extract data from internal action representation and show it to the
+ * user using the created widgets.
+ *
+ * @param stack Value widget stack to use
+ * @param action The action representation
+ */
+ virtual void setAction(QWidgetStack *stack, const Action *action) const = 0;
+
+ /**
+ * This method should return the current action value.
+ *
+ * @param values Value widget stack to use
+ * @return A valid action value
+ */
+ virtual QVariant getActionValue(QWidget *widget) const = 0;
+};
+
+/**
+ * This class keeps a list of all registred condition and action widget
+ * handlers. It is a singleton.
+ *
+ * @author Jernej Kos
+ */
+class WidgetHandlerManager
+{
+public:
+ /**
+ * Get the global class instance.
+ */
+ static WidgetHandlerManager *self();
+
+ /**
+ * Class destructor.
+ */
+ ~WidgetHandlerManager();
+
+ /**
+ * Create widgets for all currently registred condition handlers.
+ *
+ * @param types Type widget stack to use
+ * @param value Value widget stack to use
+ * @param receiver Object that receives change notifications
+ */
+ void createConditionWidgets(QWidgetStack *types, QWidgetStack *values, const QObject *receiver);
+
+ /**
+ * Create widgets for all currently registred action handlers.
+ *
+ * @param stack Value widget stack to use
+ * @param receiver Object that receives change notifications
+ */
+ void createActionWidgets(QWidgetStack *stack, const QObject *receiver);
+
+ /**
+ * Update the specified condition widget handler.
+ *
+ * @param field New condition field
+ * @param types Type widget stack to use
+ * @param values Value widget stack to use
+ */
+ void update(Field field, QWidgetStack *types, QWidgetStack *values);
+
+ /**
+ * Extract data from internal condition representation and show it to the
+ * user using the created widgets.
+ *
+ * @param types Type widget stack to use
+ * @param values Value widget stack to use
+ * @param condition The condition representation
+ */
+ void setCondition(QWidgetStack *types, QWidgetStack *values, const Condition *condition);
+
+ /**
+ * Get the currently selected condition type.
+ *
+ * @param field Condition field
+ * @param types Type widget stack to use
+ * @return A valid Condition::Type
+ */
+ Condition::Type getConditionType(Field field, QWidgetStack *types);
+
+ /**
+ * Get the current condition value.
+ *
+ * @param field Condition field
+ * @param values Value widget stack to use
+ * @return A valid condition value
+ */
+ QVariant getConditionValue(Field field, QWidgetStack *values);
+
+ /**
+ * Extract data from internal action representation and show it to the
+ * user using the created widgets.
+ *
+ * @param stack Value widget stack to use
+ * @param action The action representation
+ */
+ void setAction(QWidgetStack *stack, const Action *action);
+
+ /**
+ * Get the current action value.
+ *
+ * @param stack Value widget stack to use
+ * @return A valid action value
+ */
+ QVariant getActionValue(QWidgetStack *stack);
+
+ /**
+ * Register a new condition handler with the manager.
+ *
+ * @param field Field that this handler handles
+ * @param handler The actual handler instance
+ */
+ void registerConditionHandler(Field field, ConditionWidgetHandler *handler);
+
+ /**
+ * Register a new action handler with the manager.
+ *
+ * @param type Action type that this handler handles
+ * @param handler The actual handler instance
+ */
+ void registerActionHandler(Action::Type type, ActionWidgetHandler *handler);
+protected:
+ /**
+ * Class constructor.
+ */
+ WidgetHandlerManager();
+private:
+ static WidgetHandlerManager *m_self;
+
+ typedef QMap<Field, ConditionWidgetHandler*> ConditionHandlerMap;
+ ConditionHandlerMap m_conditionHandlers;
+
+ typedef QMap<Action::Type, ActionWidgetHandler*> ActionHandlerMap;
+ ActionHandlerMap m_actionHandlers;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/misc/interfaces/Makefile.am b/kftpgrabber/src/misc/interfaces/Makefile.am
new file mode 100644
index 0000000..8d88141
--- /dev/null
+++ b/kftpgrabber/src/misc/interfaces/Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES = -I$(top_srcdir)/kftpgrabber/src/ftp \
+ -I$(top_srcdir)/kftpgrabber/src/qsa \
+ $(all_includes)
+
+METASOURCES = AUTO
+
+lib_LTLIBRARIES = libkftpinterfaces.la
+libkftpinterfaces_la_SOURCES = kftpbookmarkimportplugin.cpp
+libkftpinterfaces_la_LDFLAGS = $(all_libraries) -version-info 0:0:0 -no-undefined
+libkftpinterfaces_la_LIBADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KPARTS)
+
+kftpgrabberincludedir = $(includedir)/kftpgrabber
+kftpgrabberinclude_HEADERS = kftpbookmarkimportplugin.h
+
+kde_servicetypes_DATA = kftpbookmarkimportplugin.desktop
diff --git a/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.cpp b/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.cpp
new file mode 100644
index 0000000..49a7322
--- /dev/null
+++ b/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.cpp
@@ -0,0 +1,55 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpbookmarkimportplugin.h"
+
+#include <qdir.h>
+
+KFTPBookmarkImportPlugin::KFTPBookmarkImportPlugin(QObject *parent, const char *name)
+ : KParts::Plugin(parent, name)
+{
+}
+
+
+KFTPBookmarkImportPlugin::~KFTPBookmarkImportPlugin()
+{
+}
+
+QString KFTPBookmarkImportPlugin::userPath(const QString &path)
+{
+ return QDir::homeDirPath() + "/" + path;
+}
+
+#include "kftpbookmarkimportplugin.moc"
diff --git a/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.desktop b/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.desktop
new file mode 100644
index 0000000..48d124e
--- /dev/null
+++ b/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.desktop
@@ -0,0 +1,29 @@
+[Desktop Entry]
+Type=ServiceType
+X-KDE-ServiceType=KFTPGrabber/BookmarkImportPlugin
+Comment=A KFTPGrabber plugin for importing bookmarks
+Comment[ar]=قابس KFTPGrabber لإستيراد علامات المواقع
+Comment[bg]=Приставка за импортиране на отметки в KFTPGrabber
+Comment[cs]=Modul KFTPGrabbera pro import záložek
+Comment[da]=Et KFTPGrabber plugin til at importere bogmærker
+Comment[de]=KFTPGrabber-Modul zum Lesezeichenimport
+Comment[el]=Ένα πρόσθετο του KFTPGrabber για την εισαγωγή σελιδοδεικτών
+Comment[es]=Un complemento de KFTPGrabber para importar marcadores
+Comment[et]=KFTPGrabberi järjehoidjate importimise plugin
+Comment[fr]=Un module KFTPGrabber pour l'importation de signets
+Comment[ga]=Breiseán KFTPGrabber le haghaidh iompórtála leabharmharcanna
+Comment[gl]=Un plugin de KFTPGrabber para importar marcadores
+Comment[it]=Un plugin per KFTPGrabber per importare i segnalibri
+Comment[ja]=KFTPGrabber ブックマークをインポートするプラグイン
+Comment[ka]=სანიშნეების იმპორტის მოდული KFTPGrabber-თვის
+Comment[lt]=KFTPGrabber įskiepis žymelių importavimui
+Comment[nl]=een KFTPGrabber-plugin voor het importeren van bladwijzers
+Comment[pt]=Um 'plugin' do KFTPGrabber para importar listas de favoritos
+Comment[pt_BR]=Um plug-in do KFTPGrabber para a importar favoritos
+Comment[sr]=Прикључак KFTPGrabber-а за увоз маркера
+Comment[sr@Latn]=Priključak KFTPGrabber-a za uvoz markera
+Comment[sv]=Ett insticksprogram för bokmärkesimport till KFTPgrabber
+Comment[tr]=Yer imlerini almak için KFTPGrabber eklentisi
+Comment[uk]=Втулок KFTPGrabber для імпортування закладок
+Comment[xx]=xxA KFTPGrabber plugin for importing bookmarksxx
+Comment[zh_CN]=导入书签的 KFTPGrabber 插件
diff --git a/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.h b/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.h
new file mode 100644
index 0000000..e82a718
--- /dev/null
+++ b/kftpgrabber/src/misc/interfaces/kftpbookmarkimportplugin.h
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKIMPORTPLUGIN_H
+#define KFTPBOOKMARKIMPORTPLUGIN_H
+
+#include <kparts/plugin.h>
+
+/**
+ * This class is the base class for all bookmark import plugins.
+ *
+ * @author Jernej Kos
+ */
+class KFTPBookmarkImportPlugin : public KParts::Plugin {
+Q_OBJECT
+public:
+ KFTPBookmarkImportPlugin(QObject *parent, const char *name = 0);
+ virtual ~KFTPBookmarkImportPlugin();
+
+ /**
+ * This method should return the properly formated XML for KFTPGrabber
+ * bookmarks that is generated from the import.
+ *
+ * @return The @ref QDomDocument representation of XML
+ */
+ virtual QDomDocument getImportedXml() = 0;
+
+ /**
+ * This method should start the import procedure.
+ *
+ * @param fileName is the path to the file that will be imported
+ */
+ virtual void import(const QString &fileName) = 0;
+
+ /**
+ * This method should return the default path where the bookmarks could
+ * be located. The path must be relative to the user's home directory.
+ *
+ * @return The default path where bookmarks are located
+ */
+ virtual QString getDefaultPath() = 0;
+protected:
+ QString userPath(const QString &path);
+signals:
+ /**
+ * Progress of bookmark importing (in percent).
+ */
+ void progress(int percent);
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/kftpapi.cpp b/kftpgrabber/src/misc/kftpapi.cpp
new file mode 100644
index 0000000..e6498a2
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpapi.cpp
@@ -0,0 +1,81 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpapi.h"
+#include "kftpwalletconnection.h"
+#include "kftppluginmanager.h"
+#include "kftpzeroconf.h"
+
+KFTPAPI *KFTPAPI::m_instance = 0L;
+
+KFTPAPI *KFTPAPI::getInstance()
+{
+ if (!m_instance)
+ m_instance = new KFTPAPI();
+
+ return m_instance;
+}
+
+KFTPAPI::KFTPAPI()
+{
+ m_zeroconfInterface = new KFTPZeroConf(this);
+}
+
+KFTPAPI::~KFTPAPI()
+{
+ m_instance = 0L;
+}
+
+KFTPPluginManager *KFTPAPI::pluginManager()
+{
+ return KFTPPluginManager::getInstance();
+}
+
+KFTPWalletConnection *KFTPAPI::walletConnection()
+{
+ return KFTPWalletConnection::getInstance();
+}
+
+MainWindow *KFTPAPI::mainWindow()
+{
+ return m_mainWindow;
+}
+
+KFTPZeroConf *KFTPAPI::zeroConfInterface()
+{
+ return m_zeroconfInterface;
+}
+
+#include "kftpapi.moc"
diff --git a/kftpgrabber/src/misc/kftpapi.h b/kftpgrabber/src/misc/kftpapi.h
new file mode 100644
index 0000000..3a77ab4
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpapi.h
@@ -0,0 +1,73 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPAPI_H
+#define KFTPAPI_H
+
+#include <config.h>
+#include <qobject.h>
+
+#include "mainwindow.h"
+
+class KFTPPluginManager;
+class KFTPWalletConnection;
+class KFTPZeroConf;
+
+/**
+@author Jernej Kos
+*/
+class KFTPAPI : public QObject
+{
+Q_OBJECT
+friend class MainWindow;
+public:
+ KFTPAPI();
+ ~KFTPAPI();
+
+ static KFTPAPI *getInstance();
+
+ KFTPPluginManager *pluginManager();
+ KFTPWalletConnection *walletConnection();
+ MainWindow *mainWindow();
+
+ KFTPZeroConf *zeroConfInterface();
+private:
+ static KFTPAPI *m_instance;
+
+ MainWindow *m_mainWindow;
+ KFTPZeroConf *m_zeroconfInterface;
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/kftpgrabber.kcfg b/kftpgrabber/src/misc/kftpgrabber.kcfg
new file mode 100644
index 0000000..80cc583
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpgrabber.kcfg
@@ -0,0 +1,319 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE kcfg SYSTEM "http://www.kde.org/standards/kcfg/1.0/kcfg.dtd">
+<kcfg>
+ <kcfgfile name="kftpgrabberrc"/>
+
+ <!-- Includes -->
+ <include>qsize.h</include>
+ <include>qpoint.h</include>
+ <include>qdir.h</include>
+ <include>configbase.h</include>
+
+ <!-- Config groups -->
+ <group name="MainWindow">
+ <entry name="size" type="Size">
+ <default code="true">QSize(800, 500)</default>
+ <label>The size of the main window.</label>
+ </entry>
+ <entry name="position" type="Point">
+ <default code="true">QPoint(0, 0)</default>
+ <label>The position of the main window on the screen.</label>
+ </entry>
+ </group>
+
+ <group name="General">
+ <entry name="retryCount" type="Int">
+ <default>10</default>
+ <min>0</min>
+ <label>The default retry count for new sites.</label>
+ </entry>
+
+ <entry name="retryTime" type="Int">
+ <default>60</default>
+ <min>0</min>
+ <label>The default retry delay for new sites.</label>
+ </entry>
+
+ <entry name="showBalloons" type="Bool">
+ <default>true</default>
+ <label>Should a balloon be displayed when some actions complete.</label>
+ </entry>
+
+ <entry name="showBalloonWhenQueueEmpty" type="Bool">
+ <default>false</default>
+ <label>Should a balloon be displayed when all queued transfers are completed.</label>
+ </entry>
+
+ <entry name="showRetrySuccessBalloon" type="Bool">
+ <default>true</default>
+ <label>Should a balloon be displayed when a connection to the server is successfully established after retrying.</label>
+ </entry>
+
+ <entry name="confirmExit" type="Bool">
+ <default>true</default>
+ <label>Should the user confirm exit if there are transfers running.</label>
+ </entry>
+
+ <entry name="encryptBookmarks" type="Bool">
+ <default>false</default>
+ <label>Encryption status of the bookmarks file.</label>
+ </entry>
+
+ <entry name="defLocalDir" type="Path">
+ <default code="true">QDir::homeDirPath()</default>
+ <label>Default local directory.</label>
+ </entry>
+
+ <entry name="exitOnClose" type="Bool">
+ <default>false</default>
+ <label>Should the application exit when users clicks the X button.</label>
+ </entry>
+
+ <entry name="startMinimized" type="Bool">
+ <default>false</default>
+ <label>Should the application be started minimized.</label>
+ </entry>
+
+ <entry name="showSplash" type="Bool">
+ <default>true</default>
+ <label>Should the splash screen be displayed when starting the application.</label>
+ </entry>
+
+ <entry name="showSystrayIcon" type="Bool">
+ <default>true</default>
+ <label>Should the systray icon be displayed.</label>
+ </entry>
+
+ <entry name="showWalletSites" type="Bool">
+ <default>false</default>
+ <label>Should the sites from KWallet be shown among the bookmarks.</label>
+ </entry>
+
+ <entry name="confirmDisconnects" type="Bool">
+ <default>true</default>
+ <label>Should a "confirm disconnect" dialog be displayed each time a disconnect is requested.</label>
+ </entry>
+
+ <entry name="defEncoding" type="String">
+ <default>iso 8859-1</default>
+ <label>The default site encoding.</label>
+ </entry>
+
+ <entry name="recentSites" type="StringList">
+ <label>Recent sites accessed via quick connect.</label>
+ </entry>
+ </group>
+
+ <group name="Actions">
+ <entry name="downloadActions" type="String">
+ <default>4;4;4;4;4;4;4;4;4;</default>
+ </entry>
+
+ <entry name="uploadActions" type="String">
+ <default>4;4;4;4;4;4;4;4;4;</default>
+ </entry>
+
+ <entry name="fxpActions" type="String">
+ <default>4;4;4;4;4;4;4;4;4;</default>
+ </entry>
+ </group>
+
+ <group name="Filters">
+ <entry name="asciiList" type="StringList">
+ <default>.txt,.bat,.php,.asp,.htm,.html,.css,.cpp,.h,.hpp,.js,.inc,.nfo,.pl,.sh,.xml,.sql</default>
+ <label>A list of file patters where ASCII mode should be used for transfer.</label>
+ </entry>
+
+ <entry name="skipEmptyDirs" type="Bool">
+ <default>false</default>
+ <label>Should empty directories be skipped.</label>
+ </entry>
+ </group>
+
+ <group name="Log">
+ <entry name="logFont" type="Font">
+ <label>The font that should be used for the log widget.</label>
+ <default code="true">KGlobalSettings::generalFont()</default>
+ </entry>
+
+ <entry name="logCommandsColor" type="Color">
+ <default code="true">QColor(67, 170, 23)</default>
+ <label>The color of the commands sent to the server.</label>
+ </entry>
+
+ <entry name="logResponsesColor" type="Color">
+ <default code="true">QColor(0, 0, 255)</default>
+ <label>The color of the responses from the server.</label>
+ </entry>
+
+ <entry name="logMultilineColor" type="Color">
+ <default code="true">QColor(148, 188, 22)</default>
+ <label>The color of the multiline responses from the server.</label>
+ </entry>
+
+ <entry name="logErrorColor" type="Color">
+ <default code="true">QColor(255, 0, 0)</default>
+ <label>The color of the error messages.</label>
+ </entry>
+
+ <entry name="logStatusColor" type="Color">
+ <default code="true">QColor(0, 0, 0)</default>
+ <label>The color of the status messages.</label>
+ </entry>
+
+ <entry name="saveToFile" type="Bool">
+ <default>false</default>
+ <label>Should the log be written to a file as well.</label>
+ </entry>
+
+ <entry name="outputFilename" type="Path">
+ <label>The file to which the log should be written.</label>
+ </entry>
+ </group>
+
+ <group name="Transfers">
+ <entry name="activeForcePort" type="Bool">
+ <default>false</default>
+ <label>Should a port from a specified portrange be selected on active transfers.</label>
+ </entry>
+
+ <entry name="activeMinPort" type="Int">
+ <default>0</default>
+ <min>0</min>
+ <max>65536</max>
+ <label>The start of the portrange.</label>
+ </entry>
+
+ <entry name="activeMaxPort" type="Int">
+ <default>65536</default>
+ <min>0</min>
+ <max>65536</max>
+ <label>The end of the portrange.</label>
+ </entry>
+
+ <entry name="portForceIp" type="Bool">
+ <default>false</default>
+ <label>Should an IP be overriden when doing active transfers.</label>
+ </entry>
+
+ <entry name="portIp" type="String">
+ <label>The IP to be sent when overriding the PORT command.</label>
+ </entry>
+
+ <entry name="ignoreExternalIpForLan" type="Bool">
+ <default>true</default>
+ <label>Should the external IP be ignored for LAN connections.</label>
+ </entry>
+
+ <entry name="queueOnDND" type="Bool">
+ <default>false</default>
+ <label>Should the transfers be queued insted of started when using drag and drop.</label>
+ </entry>
+
+ <entry name="diskCheckSpace" type="Bool">
+ <default>false</default>
+ <label>Should kftpgrabber check for free space and abort the transfer when there is not enough free.</label>
+ </entry>
+
+ <entry name="diskCheckInterval" type="Int">
+ <default>60</default>
+ <min>30</min>
+ <label>Interval for disk checking.</label>
+ </entry>
+
+ <entry name="diskMinFreeSpace" type="Int">
+ <default>500</default>
+ <min>0</min>
+ <label>Minimum free space (in MiB) that must be available.</label>
+ </entry>
+
+ <entry name="globalMail" type="Bool">
+ <default>true</default>
+ <label>Use global KDE e-mail address for anonymous passwords.</label>
+ </entry>
+
+ <entry name="anonMail" type="String">
+ <default code="true">getGlobalMail()</default>
+ <label>The e-mail address that should be used for anonymous passwords.</label>
+ </entry>
+
+ <entry name="threadCount" type="Int">
+ <default>1</default>
+ <min>1</min>
+ <max>10</max>
+ <label>Number of threads to use when transfering.</label>
+ </entry>
+
+ <entry name="threadUsePrimary" type="Bool">
+ <default>true</default>
+ <label>Should the primary connection be used for transfers.</label>
+ </entry>
+
+ <entry name="controlTimeout" type="Int">
+ <default>60</default>
+ <min>10</min>
+ <label>Timeout (in seconds) for the control connection.</label>
+ </entry>
+
+ <entry name="dataTimeout" type="Int">
+ <default>60</default>
+ <min>10</min>
+ <max>300</max>
+ <label>Timeout (in seconds) for data transfers.</label>
+ </entry>
+
+ <entry name="downloadSpeedLimit" type="Int">
+ <default>0</default>
+ <label>Global download speed limit (kbytes/s).</label>
+ </entry>
+
+ <entry name="uploadSpeedLimit" type="Int">
+ <default>0</default>
+ <label>Global upload speed limit (kbytes/s).</label>
+ </entry>
+
+ <entry name="failedAutoRetry" type="Bool">
+ <default>false</default>
+ <label>Should failed transfers be automaticly retried.</label>
+ </entry>
+
+ <entry name="failedAutoRetryCount" type="Int">
+ <default>1</default>
+ <min>1</min>
+ <max>20</max>
+ <label>Maximum number of retries before marking transfer as failed.</label>
+ </entry>
+ </group>
+
+ <group name="Display">
+ <entry name="showTree" type="Bool">
+ <default>true</default>
+ <label>Should the directory tree be shown by default.</label>
+ </entry>
+
+ <entry name="showHiddenFiles" type="Bool">
+ <default>true</default>
+ <label>Should hidden files be shown when browsing.</label>
+ </entry>
+
+ <entry name="showSizeInBytes" type="Bool">
+ <default>false</default>
+ <label>Should the filesize be shown in bytes rather than in "human readable" form.</label>
+ </entry>
+
+ <entry name="showOwnerGroup" type="Bool">
+ <default>false</default>
+ <label>Should the owner and group be shown for each file.</label>
+ </entry>
+
+ <entry name="showDirectorySize" type="Bool">
+ <default>false</default>
+ <label>Show directory size.</label>
+ </entry>
+
+ <entry name="showLeftSidebar" type="Bool">
+ <default>false</default>
+ <label>Show left sidebar.</label>
+ </entry>
+ </group>
+</kcfg>
diff --git a/kftpgrabber/src/misc/kftpotpgenerator.cpp b/kftpgrabber/src/misc/kftpotpgenerator.cpp
new file mode 100644
index 0000000..ea6bb73
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpotpgenerator.cpp
@@ -0,0 +1,470 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpotpgenerator.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+/* OpenSSL includes */
+#include <openssl/md4.h>
+#include <openssl/md5.h>
+#include <openssl/ripemd.h>
+#include <openssl/sha.h>
+
+KFTPOTPGenerator::KFTPOTPGenerator(const QString &challenge, const QString &password)
+{
+ m_password = password;
+
+ /* Parse the string and set the alg */
+ //otp-md5 498 gr4542
+ QString alg = challenge.section(' ', 0, 0);
+ if (alg == "otp-md4" || alg == "s/key")
+ m_alg = ALG_MD4;
+ else if (alg == "otp-md5")
+ m_alg = ALG_MD5;
+ else if (alg == "otp-rmd160")
+ m_alg = ALG_RMD160;
+ else if (alg == "otp-sha1")
+ m_alg = ALG_SHA1;
+ else
+ m_alg = ALG_NONE;
+
+ // Extract the actual challenge
+ m_seq = challenge.section(' ', 1, 1).toInt();
+ m_seed = challenge.section(' ', 2, 2).stripWhiteSpace().lower();
+}
+
+void KFTPOTPGenerator::genDigest(char *msg, unsigned int len)
+{
+ switch (m_alg) {
+ case ALG_MD4: genDigestMD(4, msg, len); break;
+ case ALG_MD5: genDigestMD(5, msg, len); break;
+ case ALG_RMD160: genDigestRS(0, msg, len); break;
+ case ALG_SHA1: genDigestRS(1, msg, len); break;
+ default: {
+ qDebug("[OTP] Unknown algorythm!");
+ }
+ }
+}
+
+QString KFTPOTPGenerator::generateOTP()
+{
+ if (m_alg == ALG_NONE)
+ return QString::null;
+
+ unsigned char results[9];
+ char *tmp = (char*) malloc(m_seed.length() + m_password.length());
+ strcpy(tmp, QString(m_seed + m_password).ascii());
+ genDigest(tmp, strlen(tmp));
+
+ memcpy(results, tmp, 8);
+ free(tmp);
+
+ for (unsigned short i = 0; i < m_seq; i++) {
+ genDigest((char*) results, 8);
+ }
+
+ results[8] = parity(results);
+ char *response = (char*) malloc(31);
+ sixWords(results, response);
+
+ return QString(response);
+}
+
+void KFTPOTPGenerator::genDigestMD(int type, char *msg, unsigned int len)
+{
+ unsigned char digest[16];
+ unsigned short i;
+
+ if (type == 4)
+ MD4((const unsigned char*)msg, len, digest);
+ else if (type == 5)
+ MD5((const unsigned char*)msg, len, digest);
+
+ for(i = 0; i < 8; i++)
+ digest[i] ^= digest[i+8];
+
+ memcpy(msg, digest, 8);
+}
+
+void KFTPOTPGenerator::genDigestRS(int type, char *msg, unsigned int len)
+{
+ unsigned char digest[20];
+ unsigned short i;
+
+ if (type == 0)
+ RIPEMD160((const unsigned char*)msg, len, digest);
+ else if (type == 1)
+ SHA1((const unsigned char*)msg, len, digest);
+
+ for(i = 0; i < 8; i++)
+ digest[i] ^= digest[i+8];
+
+ for(i = 0; i < 4; i++)
+ digest[i] ^= digest[i+16];
+
+ memcpy(msg, digest, 8);
+}
+
+unsigned short KFTPOTPGenerator::extract(char *s, int start, int len)
+{
+ unsigned char cl;
+ unsigned char cc;
+ unsigned char cr;
+ unsigned int x;
+
+
+ cl = s[start / 8];
+ cc = s[start / 8 + 1];
+ cr = s[start / 8 + 2];
+ x = ((int) (cl << 8 | cc) << 8 | cr);
+ x = x >> (24 - (len + (start % 8)));
+ x = (x & (0xffff >> (16 - len)));
+
+ return (unsigned short)x;
+}
+
+unsigned char KFTPOTPGenerator::parity(unsigned char *msg)
+{
+
+ unsigned short parity, i;
+ parity = 0;
+
+ for (i = 0; i < 64; i += 2) {
+ parity += extract((char*)msg, i, 2);
+ }
+
+ return (unsigned char)parity << 6;
+}
+
+unsigned char *KFTPOTPGenerator::sixWords(unsigned char *msg, char *response)
+{
+ static const char *words[2048] = {
+ "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", "AGO",
+ "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", "AN",
+ "ANA", "AND", "ANN", "ANT", "ANY", "APE", "APS", "APT",
+ "ARC", "ARE", "ARK", "ARM", "ART", "AS", "ASH", "ASK",
+ "AT", "ATE", "AUG", "AUK", "AVE", "AWE", "AWK", "AWL",
+ "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM", "BAN",
+ "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", "BEN",
+ "BET", "BEY", "BIB", "BID", "BIG", "BIN", "BIT", "BOB",
+ "BOG", "BON", "BOO", "BOP", "BOW", "BOY", "BUB", "BUD",
+ "BUG", "BUM", "BUN", "BUS", "BUT", "BUY", "BY", "BYE",
+ "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", "CAW",
+ "COD", "COG", "COL", "CON", "COO", "COP", "COT", "COW",
+ "COY", "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", "DAB",
+ "DAD", "DAM", "DAN", "DAR", "DAY", "DEE", "DEL", "DEN",
+ "DES", "DEW", "DID", "DIE", "DIG", "DIN", "DIP", "DO",
+ "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB", "DUD",
+ "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", "EGG",
+ "EGO", "ELI", "ELK", "ELM", "ELY", "EM", "END", "EST",
+ "ETC", "EVA", "EVE", "EWE", "EYE", "FAD", "FAN", "FAR",
+ "FAT", "FAY", "FED", "FEE", "FEW", "FIB", "FIG", "FIN",
+ "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR", "FRY",
+ "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", "GAM",
+ "GAP", "GAS", "GAY", "GEE", "GEL", "GEM", "GET", "GIG",
+ "GIL", "GIN", "GO", "GOT", "GUM", "GUN", "GUS", "GUT",
+ "GUY", "GYM", "GYP", "HA", "HAD", "HAL", "HAM", "HAN",
+ "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", "HEN",
+ "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", "HIS",
+ "HIT", "HO", "HOB", "HOC", "HOE", "HOG", "HOP", "HOT",
+ "HOW", "HUB", "HUE", "HUG", "HUH", "HUM", "HUT", "I",
+ "ICY", "IDA", "IF", "IKE", "ILL", "INK", "INN", "IO",
+ "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", "ITS",
+ "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", "JAY",
+ "JET", "JIG", "JIM", "JO", "JOB", "JOE", "JOG", "JOT",
+ "JOY", "JUG", "JUT", "KAY", "KEG", "KEN", "KEY", "KID",
+ "KIM", "KIN", "KIT", "LA", "LAB", "LAC", "LAD", "LAG",
+ "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", "LEG",
+ "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", "LIP",
+ "LIT", "LO", "LOB", "LOG", "LOP", "LOS", "LOT", "LOU",
+ "LOW", "LOY", "LUG", "LYE", "MA", "MAC", "MAD", "MAE",
+ "MAN", "MAO", "MAP", "MAT", "MAW", "MAY", "ME", "MEG",
+ "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", "MOB",
+ "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", "MUD",
+ "MUG", "MUM", "MY", "NAB", "NAG", "NAN", "NAP", "NAT",
+ "NAY", "NE", "NED", "NEE", "NET", "NEW", "NIB", "NIL",
+ "NIP", "NIT", "NO", "NOB", "NOD", "NON", "NOR", "NOT",
+ "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", "OAK",
+ "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", "OH",
+ "OIL", "OK", "OLD", "ON", "ONE", "OR", "ORB", "ORE",
+ "ORR", "OS", "OTT", "OUR", "OUT", "OVA", "OW", "OWE",
+ "OWL", "OWN", "OX", "PA", "PAD", "PAL", "PAM", "PAN",
+ "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", "PEN",
+ "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", "PIN",
+ "PIT", "PLY", "PO", "POD", "POE", "POP", "POT", "POW",
+ "PRO", "PRY", "PUB", "PUG", "PUN", "PUP", "PUT", "QUO",
+ "RAG", "RAM", "RAN", "RAP", "RAT", "RAW", "RAY", "REB",
+ "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", "RIO",
+ "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", "ROY",
+ "RUB", "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", "SAD",
+ "SAG", "SAL", "SAM", "SAN", "SAP", "SAT", "SAW", "SAY",
+ "SEA", "SEC", "SEE", "SEN", "SET", "SEW", "SHE", "SHY",
+ "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", "SLY",
+ "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", "SPA",
+ "SPY", "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", "TAB",
+ "TAD", "TAG", "TAN", "TAP", "TAR", "TEA", "TED", "TEE",
+ "TEN", "THE", "THY", "TIC", "TIE", "TIM", "TIN", "TIP",
+ "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", "TOW",
+ "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", "UN",
+ "UP", "US", "USE", "VAN", "VAT", "VET", "VIE", "WAD",
+ "WAG", "WAR", "WAS", "WAY", "WE", "WEB", "WED", "WEE",
+ "WET", "WHO", "WHY", "WIN", "WIT", "WOK", "WON", "WOO",
+ "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", "YEA",
+ "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE",
+ "ABUT", "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS",
+ "ADAM", "ADDS", "ADEN", "AFAR", "AFRO", "AGEE", "AHEM",
+ "AHOY", "AIDA", "AIDE", "AIDS", "AIRY", "AJAR", "AKIN",
+ "ALAN", "ALEC", "ALGA", "ALIA", "ALLY", "ALMA", "ALOE",
+ "ALSO", "ALTO", "ALUM", "ALVA", "AMEN", "AMES", "AMID",
+ "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", "ANEW", "ANNA",
+ "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", "AREA",
+ "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS",
+ "ATOM", "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS",
+ "AVON", "AVOW", "AWAY", "AWRY", "BABE", "BABY", "BACH",
+ "BACK", "BADE", "BAIL", "BAIT", "BAKE", "BALD", "BALE",
+ "BALI", "BALK", "BALL", "BALM", "BAND", "BANE", "BANG",
+ "BANK", "BARB", "BARD", "BARE", "BARK", "BARN", "BARR",
+ "BASE", "BASH", "BASK", "BASS", "BATE", "BATH", "BAWD",
+ "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", "BEAT",
+ "BEAU", "BECK", "BEEF", "BEEN", "BEER", "BEET", "BELA",
+ "BELL", "BELT", "BEND", "BENT", "BERG", "BERN", "BERT",
+ "BESS", "BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE",
+ "BIEN", "BILE", "BILK", "BILL", "BIND", "BING", "BIRD",
+ "BITE", "BITS", "BLAB", "BLAT", "BLED", "BLEW", "BLOB",
+ "BLOC", "BLOT", "BLOW", "BLUE", "BLUM", "BLUR", "BOAR",
+ "BOAT", "BOCA", "BOCK", "BODE", "BODY", "BOGY", "BOHR",
+ "BOIL", "BOLD", "BOLO", "BOLT", "BOMB", "BONA", "BOND",
+ "BONE", "BONG", "BONN", "BONY", "BOOK", "BOOM", "BOON",
+ "BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS", "BOTH",
+ "BOUT", "BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN",
+ "BRAY", "BRED", "BREW", "BRIG", "BRIM", "BROW", "BUCK",
+ "BUDD", "BUFF", "BULB", "BULK", "BULL", "BUNK", "BUNT",
+ "BUOY", "BURG", "BURL", "BURN", "BURR", "BURT", "BURY",
+ "BUSH", "BUSS", "BUST", "BUSY", "BYTE", "CADY", "CAFE",
+ "CAGE", "CAIN", "CAKE", "CALF", "CALL", "CALM", "CAME",
+ "CANE", "CANT", "CARD", "CARE", "CARL", "CARR", "CART",
+ "CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL", "CELL",
+ "CENT", "CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF",
+ "CHEN", "CHEW", "CHIC", "CHIN", "CHOU", "CHOW", "CHUB",
+ "CHUG", "CHUM", "CITE", "CITY", "CLAD", "CLAM", "CLAN",
+ "CLAW", "CLAY", "CLOD", "CLOG", "CLOT", "CLUB", "CLUE",
+ "COAL", "COAT", "COCA", "COCK", "COCO", "CODA", "CODE",
+ "CODY", "COED", "COIL", "COIN", "COKE", "COLA", "COLD",
+ "COLT", "COMA", "COMB", "COME", "COOK", "COOL", "COON",
+ "COOT", "CORD", "CORE", "CORK", "CORN", "COST", "COVE",
+ "COWL", "CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB",
+ "CROW", "CRUD", "CUBA", "CUBE", "CUFF", "CULL", "CULT",
+ "CUNY", "CURB", "CURD", "CURE", "CURL", "CURT", "CUTS",
+ "DADE", "DALE", "DAME", "DANA", "DANE", "DANG", "DANK",
+ "DARE", "DARK", "DARN", "DART", "DASH", "DATA", "DATE",
+ "DAVE", "DAVY", "DAWN", "DAYS", "DEAD", "DEAF", "DEAL",
+ "DEAN", "DEAR", "DEBT", "DECK", "DEED", "DEEM", "DEER",
+ "DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", "DIAL",
+ "DICE", "DIED", "DIET", "DIME", "DINE", "DING", "DINT",
+ "DIRE", "DIRT", "DISC", "DISH", "DISK", "DIVE", "DOCK",
+ "DOES", "DOLE", "DOLL", "DOLT", "DOME", "DONE", "DOOM",
+ "DOOR", "DORA", "DOSE", "DOTE", "DOUG", "DOUR", "DOVE",
+ "DOWN", "DRAB", "DRAG", "DRAM", "DRAW", "DREW", "DRUB",
+ "DRUG", "DRUM", "DUAL", "DUCK", "DUCT", "DUEL", "DUET",
+ "DUKE", "DULL", "DUMB", "DUNE", "DUNK", "DUSK", "DUST",
+ "DUTY", "EACH", "EARL", "EARN", "EASE", "EAST", "EASY",
+ "EBEN", "ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT",
+ "EDNA", "EGAN", "ELAN", "ELBA", "ELLA", "ELSE", "EMIL",
+ "EMIT", "EMMA", "ENDS", "ERIC", "EROS", "EVEN", "EVER",
+ "EVIL", "EYED", "FACE", "FACT", "FADE", "FAIL", "FAIN",
+ "FAIR", "FAKE", "FALL", "FAME", "FANG", "FARM", "FAST",
+ "FATE", "FAWN", "FEAR", "FEAT", "FEED", "FEEL", "FEET",
+ "FELL", "FELT", "FEND", "FERN", "FEST", "FEUD", "FIEF",
+ "FIGS", "FILE", "FILL", "FILM", "FIND", "FINE", "FINK",
+ "FIRE", "FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE",
+ "FLAG", "FLAK", "FLAM", "FLAT", "FLAW", "FLEA", "FLED",
+ "FLEW", "FLIT", "FLOC", "FLOG", "FLOW", "FLUB", "FLUE",
+ "FOAL", "FOAM", "FOGY", "FOIL", "FOLD", "FOLK", "FOND",
+ "FONT", "FOOD", "FOOL", "FOOT", "FORD", "FORE", "FORK",
+ "FORM", "FORT", "FOSS", "FOUL", "FOUR", "FOWL", "FRAU",
+ "FRAY", "FRED", "FREE", "FRET", "FREY", "FROG", "FROM",
+ "FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY", "FUSE",
+ "FUSS", "GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA",
+ "GALE", "GALL", "GALT", "GAME", "GANG", "GARB", "GARY",
+ "GASH", "GATE", "GAUL", "GAUR", "GAVE", "GAWK", "GEAR",
+ "GELD", "GENE", "GENT", "GERM", "GETS", "GIBE", "GIFT",
+ "GILD", "GILL", "GILT", "GINA", "GIRD", "GIRL", "GIST",
+ "GIVE", "GLAD", "GLEE", "GLEN", "GLIB", "GLOB", "GLOM",
+ "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", "GOAL", "GOAT",
+ "GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", "GOOD",
+ "GOOF", "GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB",
+ "GRAD", "GRAY", "GREG", "GREW", "GREY", "GRID", "GRIM",
+ "GRIN", "GRIT", "GROW", "GRUB", "GULF", "GULL", "GUNK",
+ "GURU", "GUSH", "GUST", "GWEN", "GWYN", "HAAG", "HAAS",
+ "HACK", "HAIL", "HAIR", "HALE", "HALF", "HALL", "HALO",
+ "HALT", "HAND", "HANG", "HANK", "HANS", "HARD", "HARK",
+ "HARM", "HART", "HASH", "HAST", "HATE", "HATH", "HAUL",
+ "HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", "HEAT",
+ "HEBE", "HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL",
+ "HELM", "HERB", "HERD", "HERE", "HERO", "HERS", "HESS",
+ "HEWN", "HICK", "HIDE", "HIGH", "HIKE", "HILL", "HILT",
+ "HIND", "HINT", "HIRE", "HISS", "HIVE", "HOBO", "HOCK",
+ "HOFF", "HOLD", "HOLE", "HOLM", "HOLT", "HOME", "HONE",
+ "HONK", "HOOD", "HOOF", "HOOK", "HOOT", "HORN", "HOSE",
+ "HOST", "HOUR", "HOVE", "HOWE", "HOWL", "HOYT", "HUCK",
+ "HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK", "HULL",
+ "HUNK", "HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE",
+ "HYMN", "IBIS", "ICON", "IDEA", "IDLE", "IFFY", "INCA",
+ "INCH", "INTO", "IONS", "IOTA", "IOWA", "IRIS", "IRMA",
+ "IRON", "ISLE", "ITCH", "ITEM", "IVAN", "JACK", "JADE",
+ "JAIL", "JAKE", "JANE", "JAVA", "JEAN", "JEFF", "JERK",
+ "JESS", "JEST", "JIBE", "JILL", "JILT", "JIVE", "JOAN",
+ "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", "JOIN", "JOKE",
+ "JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY", "JUJU",
+ "JUKE", "JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST",
+ "JUTE", "KAHN", "KALE", "KANE", "KANT", "KARL", "KATE",
+ "KEEL", "KEEN", "KENO", "KENT", "KERN", "KERR", "KEYS",
+ "KICK", "KILL", "KIND", "KING", "KIRK", "KISS", "KITE",
+ "KLAN", "KNEE", "KNEW", "KNIT", "KNOB", "KNOT", "KNOW",
+ "KOCH", "KONG", "KUDO", "KURD", "KURT", "KYLE", "LACE",
+ "LACK", "LACY", "LADY", "LAID", "LAIN", "LAIR", "LAKE",
+ "LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", "LARK",
+ "LASS", "LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS",
+ "LAYS", "LEAD", "LEAF", "LEAK", "LEAN", "LEAR", "LEEK",
+ "LEER", "LEFT", "LEND", "LENS", "LENT", "LEON", "LESK",
+ "LESS", "LEST", "LETS", "LIAR", "LICE", "LICK", "LIED",
+ "LIEN", "LIES", "LIEU", "LIFE", "LIFT", "LIKE", "LILA",
+ "LILT", "LILY", "LIMA", "LIMB", "LIME", "LIND", "LINE",
+ "LINK", "LINT", "LION", "LISA", "LIST", "LIVE", "LOAD",
+ "LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", "LOIS",
+ "LOLA", "LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD",
+ "LORE", "LOSE", "LOSS", "LOST", "LOUD", "LOVE", "LOWE",
+ "LUCK", "LUCY", "LUGE", "LUKE", "LULU", "LUND", "LUNG",
+ "LURA", "LURE", "LURK", "LUSH", "LUST", "LYLE", "LYNN",
+ "LYON", "LYRA", "MACE", "MADE", "MAGI", "MAID", "MAIL",
+ "MAIN", "MAKE", "MALE", "MALI", "MALL", "MALT", "MANA",
+ "MANN", "MANY", "MARC", "MARE", "MARK", "MARS", "MART",
+ "MARY", "MASH", "MASK", "MASS", "MAST", "MATE", "MATH",
+ "MAUL", "MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK",
+ "MEET", "MELD", "MELT", "MEMO", "MEND", "MENU", "MERT",
+ "MESH", "MESS", "MICE", "MIKE", "MILD", "MILE", "MILK",
+ "MILL", "MILT", "MIMI", "MIND", "MINE", "MINI", "MINK",
+ "MINT", "MIRE", "MISS", "MIST", "MITE", "MITT", "MOAN",
+ "MOAT", "MOCK", "MODE", "MOLD", "MOLE", "MOLL", "MOLT",
+ "MONA", "MONK", "MONT", "MOOD", "MOON", "MOOR", "MOOT",
+ "MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH", "MOVE",
+ "MUCH", "MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK",
+ "MUSH", "MUST", "MUTE", "MUTT", "MYRA", "MYTH", "NAGY",
+ "NAIL", "NAIR", "NAME", "NARY", "NASH", "NAVE", "NAVY",
+ "NEAL", "NEAR", "NEAT", "NECK", "NEED", "NEIL", "NELL",
+ "NEON", "NERO", "NESS", "NEST", "NEWS", "NEWT", "NIBS",
+ "NICE", "NICK", "NILE", "NINA", "NINE", "NOAH", "NODE",
+ "NOEL", "NOLL", "NONE", "NOOK", "NOON", "NORM", "NOSE",
+ "NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB", "OATH",
+ "OBEY", "OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY",
+ "OLAF", "OLDY", "OLGA", "OLIN", "OMAN", "OMEN", "OMIT",
+ "ONCE", "ONES", "ONLY", "ONTO", "ONUS", "ORAL", "ORGY",
+ "OSLO", "OTIS", "OTTO", "OUCH", "OUST", "OUTS", "OVAL",
+ "OVEN", "OVER", "OWLY", "OWNS", "QUAD", "QUIT", "QUOD",
+ "RACE", "RACK", "RACY", "RAFT", "RAGE", "RAID", "RAIL",
+ "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH", "RATE",
+ "RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK",
+ "REED", "REEF", "REEK", "REEL", "REID", "REIN", "RENA",
+ "REND", "RENT", "REST", "RICE", "RICH", "RICK", "RIDE",
+ "RIFT", "RILL", "RIME", "RING", "RINK", "RISE", "RISK",
+ "RITE", "ROAD", "ROAM", "ROAR", "ROBE", "ROCK", "RODE",
+ "ROIL", "ROLL", "ROME", "ROOD", "ROOF", "ROOK", "ROOM",
+ "ROOT", "ROSA", "ROSE", "ROSS", "ROSY", "ROTH", "ROUT",
+ "ROVE", "ROWE", "ROWS", "RUBE", "RUBY", "RUDE", "RUDY",
+ "RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", "RUSH",
+ "RUSK", "RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE",
+ "SAID", "SAIL", "SALE", "SALK", "SALT", "SAME", "SAND",
+ "SANE", "SANG", "SANK", "SARA", "SAUL", "SAVE", "SAYS",
+ "SCAN", "SCAR", "SCAT", "SCOT", "SEAL", "SEAM", "SEAR",
+ "SEAT", "SEED", "SEEK", "SEEM", "SEEN", "SEES", "SELF",
+ "SELL", "SEND", "SENT", "SETS", "SEWN", "SHAG", "SHAM",
+ "SHAW", "SHAY", "SHED", "SHIM", "SHIN", "SHOD", "SHOE",
+ "SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE", "SIFT",
+ "SIGH", "SIGN", "SILK", "SILL", "SILO", "SILT", "SINE",
+ "SING", "SINK", "SIRE", "SITE", "SITS", "SITU", "SKAT",
+ "SKEW", "SKID", "SKIM", "SKIN", "SKIT", "SLAB", "SLAM",
+ "SLAT", "SLAY", "SLED", "SLEW", "SLID", "SLIM", "SLIT",
+ "SLOB", "SLOG", "SLOT", "SLOW", "SLUG", "SLUM", "SLUR",
+ "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", "SNUG",
+ "SOAK", "SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL",
+ "SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE", "SORT",
+ "SOUL", "SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR",
+ "STAY", "STEM", "STEW", "STIR", "STOW", "STUB", "STUN",
+ "SUCH", "SUDS", "SUIT", "SULK", "SUMS", "SUNG", "SUNK",
+ "SURE", "SURF", "SWAB", "SWAG", "SWAM", "SWAN", "SWAT",
+ "SWAY", "SWIM", "SWUM", "TACK", "TACT", "TAIL", "TAKE",
+ "TALE", "TALK", "TALL", "TANK", "TASK", "TATE", "TAUT",
+ "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET",
+ "TELL", "TEND", "TENT", "TERM", "TERN", "TESS", "TEST",
+ "THAN", "THAT", "THEE", "THEM", "THEN", "THEY", "THIN",
+ "THIS", "THUD", "THUG", "TICK", "TIDE", "TIDY", "TIED",
+ "TIER", "TILE", "TILL", "TILT", "TIME", "TINA", "TINE",
+ "TINT", "TINY", "TIRE", "TOAD", "TOGO", "TOIL", "TOLD",
+ "TOLL", "TONE", "TONG", "TONY", "TOOK", "TOOL", "TOOT",
+ "TORE", "TORN", "TOTE", "TOUR", "TOUT", "TOWN", "TRAG",
+ "TRAM", "TRAY", "TREE", "TREK", "TRIG", "TRIM", "TRIO",
+ "TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK",
+ "TUFT", "TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK",
+ "TWIG", "TWIN", "TWIT", "ULAN", "UNIT", "URGE", "USED",
+ "USER", "USES", "UTAH", "VAIL", "VAIN", "VALE", "VARY",
+ "VASE", "VAST", "VEAL", "VEDA", "VEIL", "VEIN", "VEND",
+ "VENT", "VERB", "VERY", "VETO", "VICE", "VIEW", "VINE",
+ "VISE", "VOID", "VOLT", "VOTE", "WACK", "WADE", "WAGE",
+ "WAIL", "WAIT", "WAKE", "WALE", "WALK", "WALL", "WALT",
+ "WAND", "WANE", "WANG", "WANT", "WARD", "WARM", "WARN",
+ "WART", "WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY",
+ "WAYS", "WEAK", "WEAL", "WEAN", "WEAR", "WEED", "WEEK",
+ "WEIR", "WELD", "WELL", "WELT", "WENT", "WERE", "WERT",
+ "WEST", "WHAM", "WHAT", "WHEE", "WHEN", "WHET", "WHOA",
+ "WHOM", "WICK", "WIFE", "WILD", "WILL", "WIND", "WINE",
+ "WING", "WINK", "WINO", "WIRE", "WISE", "WISH", "WITH",
+ "WOLF", "WONT", "WOOD", "WOOL", "WORD", "WORE", "WORK",
+ "WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE", "YANG",
+ "YANK", "YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR",
+ "YELL", "YOGA", "YOKE"
+ };
+
+ snprintf(response, 31, "%s %s %s %s %s %s",
+ words[extract((char*)msg, 0, 11)],
+ words[extract((char*)msg, 11, 11)],
+ words[extract((char*)msg, 22, 11)],
+ words[extract((char*)msg, 33, 11)],
+ words[extract((char*)msg, 44, 11)],
+ words[extract((char*)msg, 55, 11)]);
+
+ return (unsigned char*)response;
+}
diff --git a/kftpgrabber/src/misc/kftpotpgenerator.h b/kftpgrabber/src/misc/kftpotpgenerator.h
new file mode 100644
index 0000000..5292ead
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpotpgenerator.h
@@ -0,0 +1,75 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPOTPGENERATOR_H
+#define KFTPOTPGENERATOR_H
+
+#include <qstring.h>
+
+enum AlgType {
+ ALG_MD4,
+ ALG_MD5,
+ ALG_RMD160,
+ ALG_SHA1,
+ ALG_NONE
+};
+
+/*
+ KFTPOTPGenerator - OTP generator for purpuse of FTP auth, based on code from
+ otpCalc copyright (C) 2001 by Anthony D. Urso
+*/
+
+/**
+@author Jernej Kos
+*/
+class KFTPOTPGenerator{
+public:
+ KFTPOTPGenerator(const QString &challenge, const QString &password);
+ QString generateOTP();
+private:
+ QString m_seed;
+ QString m_password;
+ AlgType m_alg;
+ int m_seq;
+
+ void genDigest(char *msg, unsigned int len);
+ void genDigestMD(int type, char *msg, unsigned int len);
+ void genDigestRS(int type, char *msg, unsigned int len);
+ static unsigned short extract(char *s, int start, int len);
+ unsigned char parity(unsigned char *msg);
+ unsigned char *sixWords(unsigned char *msg, char *response);
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/kftppluginmanager.cpp b/kftpgrabber/src/misc/kftppluginmanager.cpp
new file mode 100644
index 0000000..fc9dbb0
--- /dev/null
+++ b/kftpgrabber/src/misc/kftppluginmanager.cpp
@@ -0,0 +1,76 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftppluginmanager.h"
+#include "kftpbookmarkimportplugin.h"
+
+KFTPPluginManager *KFTPPluginManager::m_instance = 0L;
+
+KFTPPluginManager *KFTPPluginManager::getInstance()
+{
+ if (!m_instance)
+ m_instance = new KFTPPluginManager();
+
+ return m_instance;
+}
+
+KFTPPluginManager::KFTPPluginManager(QObject *parent, const char *name)
+ : QObject(parent, name)
+{
+}
+
+void KFTPPluginManager::loadPlugins()
+{
+}
+
+KTrader::OfferList KFTPPluginManager::getImportPlugins()
+{
+ return KTrader::self()->query("KFTPGrabber/BookmarkImportPlugin");
+}
+
+KFTPBookmarkImportPlugin *KFTPPluginManager::loadImportPlugin(KService::Ptr service)
+{
+ int errCode = 0;
+
+ KFTPBookmarkImportPlugin *plugin = KParts::ComponentFactory::createInstanceFromService<KFTPBookmarkImportPlugin>(service, this, 0, QStringList(), &errCode);
+
+ if (plugin) {
+ qDebug("[PLUGIN MANAGER] Loaded '%s' plugin for bookmark import.", service->name().ascii());
+ }
+
+ return plugin;
+}
+
+#include "kftppluginmanager.moc"
diff --git a/kftpgrabber/src/misc/kftppluginmanager.h b/kftpgrabber/src/misc/kftppluginmanager.h
new file mode 100644
index 0000000..b377a62
--- /dev/null
+++ b/kftpgrabber/src/misc/kftppluginmanager.h
@@ -0,0 +1,82 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPPLUGINMANAGER_H
+#define KFTPPLUGINMANAGER_H
+
+#include <kparts/componentfactory.h>
+
+#include <qobject.h>
+#include <qptrlist.h>
+
+class KFTPBookmarkImportPlugin;
+
+/**
+ * This class is responsible for loading all the KFTPGrabber plugins and
+ * their communication with the rest of the application.
+ *
+ * @author Jernej Kos
+ */
+class KFTPPluginManager : public QObject
+{
+Q_OBJECT
+public:
+ KFTPPluginManager(QObject *parent = 0, const char *name = 0);
+ static KFTPPluginManager *getInstance();
+
+ /**
+ * This method will load all the plugins.
+ */
+ void loadPlugins();
+
+ /**
+ * Load bookmark import plugin.
+ *
+ * @param service The plugin KService::Ptr
+ * @return The loaded plugin or NULL if plugin can't be loaded
+ */
+ KFTPBookmarkImportPlugin *loadImportPlugin(KService::Ptr service);
+
+ /**
+ * Returns the list of all currently loaded import plugins.
+ *
+ * @return List of all laoded import plugins
+ */
+ KTrader::OfferList getImportPlugins();
+private:
+ static KFTPPluginManager *m_instance;
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/kftpwalletconnection.cpp b/kftpgrabber/src/misc/kftpwalletconnection.cpp
new file mode 100644
index 0000000..242b00d
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpwalletconnection.cpp
@@ -0,0 +1,166 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <kurl.h>
+
+#include "kftpwalletconnection.h"
+
+KFTPWalletConnection *KFTPWalletConnection::m_instance = 0L;
+
+KFTPWalletConnection *KFTPWalletConnection::getInstance()
+{
+ if (!m_instance)
+ m_instance = new KFTPWalletConnection();
+
+ return m_instance;
+}
+
+KFTPWalletConnection::KFTPWalletConnection()
+ : QObject()
+{
+ m_wallet = 0L;
+ m_walletRefCount = 0;
+}
+
+
+KFTPWalletConnection::~KFTPWalletConnection()
+{
+ m_instance = 0L;
+ slotWalletClosed();
+}
+
+void KFTPWalletConnection::slotWalletClosed()
+{
+ m_walletRefCount--;
+ if (m_walletRefCount == 0) {
+ delete m_wallet;
+ m_wallet = 0L;
+ }
+}
+
+QValueList<KURL> KFTPWalletConnection::getSiteList()
+{
+ QValueList<KURL> sites;
+
+ if (!KWallet::Wallet::folderDoesNotExist(KWallet::Wallet::NetworkWallet(), KWallet::Wallet::PasswordFolder())) {
+ if (!m_wallet) {
+ m_wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Synchronous);
+
+ if (m_wallet) {
+ m_walletRefCount++;
+ connect(m_wallet, SIGNAL(walletClosed()), this, SLOT(slotWalletClosed()));
+ }
+ }
+
+ if (!m_wallet)
+ return QValueList<KURL>();
+
+ // Get the site list from our wallet
+ m_wallet->setFolder(KWallet::Wallet::PasswordFolder());
+
+ QStringList list = m_wallet->entryList();
+ QStringList::iterator i;
+
+ for (i = list.begin(); i != list.end(); ++i) {
+ QMap<QString, QString> map;
+
+ if ((*i).startsWith("ftp-") && m_wallet->readMap(*i, map) == 0) {
+ QString name = *i;
+ name.replace("ftp-", "ftp://");
+
+ KURL siteUrl(name);
+ siteUrl.setUser(map["login"]);
+ siteUrl.setPass(map["password"]);
+
+ if (siteUrl.port() == 0)
+ siteUrl.setPort(21);
+
+ if (sites.contains(siteUrl) == 0)
+ sites.append(siteUrl);
+ }
+ }
+ }
+
+ return sites;
+}
+
+QString KFTPWalletConnection::getPassword(const QString &whatFor)
+{
+ if (!KWallet::Wallet::folderDoesNotExist(KWallet::Wallet::NetworkWallet(), QString::fromLatin1("KFTPGrabber"))) {
+ // We have our own folder
+ if (!m_wallet) {
+ m_wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Synchronous);
+
+ if (m_wallet) {
+ m_walletRefCount++;
+ connect(m_wallet, SIGNAL(walletClosed()), this, SLOT(slotWalletClosed()));
+ }
+ }
+
+ // Try to read the password from the wallet
+ QString pass;
+ if (m_wallet && m_wallet->setFolder(QString::fromLatin1("KFTPGrabber")) && m_wallet->readPassword(whatFor, pass) == 0) {
+ return pass;
+ }
+ }
+
+ return QString::null;
+}
+
+void KFTPWalletConnection::setPassword(const QString &whatFor, const QString &password)
+{
+ if (KWallet::Wallet::isEnabled()) {
+ if (!m_wallet) {
+ m_wallet = KWallet::Wallet::openWallet(KWallet::Wallet::NetworkWallet(), 0, KWallet::Wallet::Synchronous);
+
+ if (m_wallet) {
+ m_walletRefCount++;
+ connect(m_wallet, SIGNAL(walletClosed()), this, SLOT(slotWalletClosed()));
+ }
+ }
+
+ if (m_wallet) {
+ // Create our folder
+ if (!m_wallet->hasFolder(QString::fromLatin1("KFTPGrabber"))) {
+ m_wallet->createFolder(QString::fromLatin1("KFTPGrabber"));
+ }
+
+ m_wallet->setFolder(QString::fromLatin1("KFTPGrabber"));
+ m_wallet->writePassword(whatFor, password);
+ }
+ }
+}
+
+#include "kftpwalletconnection.moc"
diff --git a/kftpgrabber/src/misc/kftpwalletconnection.h b/kftpgrabber/src/misc/kftpwalletconnection.h
new file mode 100644
index 0000000..782d0d3
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpwalletconnection.h
@@ -0,0 +1,68 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWALLETCONNECTION_H
+#define KFTPWALLETCONNECTION_H
+
+#include <kwallet.h>
+#include <qobject.h>
+
+/**
+Enables communication of KFTPGrabber with KDE's wallet system (KWallet)
+
+@author Jernej Kos
+*/
+class KFTPWalletConnection : public QObject
+{
+Q_OBJECT
+public:
+ KFTPWalletConnection();
+ ~KFTPWalletConnection();
+
+ QValueList<KURL> getSiteList();
+
+ QString getPassword(const QString &whatFor);
+ void setPassword(const QString &whatFor, const QString &password);
+
+ static KFTPWalletConnection *getInstance();
+private:
+ static KFTPWalletConnection *m_instance;
+ KWallet::Wallet *m_wallet;
+ uint m_walletRefCount;
+private slots:
+ void slotWalletClosed();
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/kftpzeroconf.cpp b/kftpgrabber/src/misc/kftpzeroconf.cpp
new file mode 100644
index 0000000..39d1f63
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpzeroconf.cpp
@@ -0,0 +1,67 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "kftpzeroconf.h"
+
+KFTPZeroConf::KFTPZeroConf(QObject *parent, const char *name)
+ : QObject(parent, name)
+{
+#if KDE_IS_VERSION(3,4,0)
+ m_browser = new DNSSD::ServiceBrowser("_ftp._tcp", 0, true);
+
+ connect(m_browser, SIGNAL(finished()), this, SLOT(slotServiceChanged()));
+
+ m_browser->startBrowse();
+#endif
+}
+
+
+KFTPZeroConf::~KFTPZeroConf()
+{
+}
+
+#if KDE_IS_VERSION(3,4,0)
+const QValueList<DNSSD::RemoteService::Ptr> &KFTPZeroConf::getServiceList() const
+{
+ return m_browser->services();
+}
+#endif
+
+void KFTPZeroConf::slotServiceChanged()
+{
+ emit servicesUpdated();
+}
+
+#include "kftpzeroconf.moc"
diff --git a/kftpgrabber/src/misc/kftpzeroconf.h b/kftpgrabber/src/misc/kftpzeroconf.h
new file mode 100644
index 0000000..68c9ca2
--- /dev/null
+++ b/kftpgrabber/src/misc/kftpzeroconf.h
@@ -0,0 +1,70 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPZEROCONF_H
+#define KFTPZEROCONF_H
+
+#include <qobject.h>
+
+#include <kdeversion.h>
+
+#if KDE_IS_VERSION(3,4,0)
+#include <dnssd/servicebrowser.h>
+#endif
+
+/**
+ * This class provides an interface to KDNSSD (that is available from KDE 3.4).
+ *
+ * @author Jernej Kos
+ */
+class KFTPZeroConf : public QObject
+{
+Q_OBJECT
+public:
+ KFTPZeroConf(QObject *parent = 0, const char *name = 0);
+ ~KFTPZeroConf();
+
+#if KDE_IS_VERSION(3,4,0)
+ const QValueList<DNSSD::RemoteService::Ptr> &getServiceList() const;
+private:
+ DNSSD::ServiceBrowser *m_browser;
+#endif
+private slots:
+ void slotServiceChanged();
+signals:
+ void servicesUpdated();
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/libs/Makefile.am b/kftpgrabber/src/misc/libs/Makefile.am
new file mode 100644
index 0000000..b4be6a2
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/Makefile.am
@@ -0,0 +1,3 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+SUBDIRS = ssh
diff --git a/kftpgrabber/src/misc/libs/ssh/Makefile.am b/kftpgrabber/src/misc/libs/ssh/Makefile.am
new file mode 100644
index 0000000..91a0031
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/Makefile.am
@@ -0,0 +1,8 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+noinst_LIBRARIES = libssh.a
+libssh_a_SOURCES = auth.c base64.c buffer.c channels.c client.c connect.c\
+ crypt.c dh.c error.c gzip.c kex.c keyfiles.c keys.c misc.c options.c\
+ packet.c sftp.c string.c wrapper.c
+noinst_HEADERS = crypto.h libssh.h sftp.h ssh2.h
+AM_CFLAGS = -w
diff --git a/kftpgrabber/src/misc/libs/ssh/auth.c b/kftpgrabber/src/misc/libs/ssh/auth.c
new file mode 100644
index 0000000..88ac7ec
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/auth.c
@@ -0,0 +1,597 @@
+/* auth.c deals with authentication methods */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include "priv.h"
+#include "ssh2.h"
+#include <string.h>
+#include <netdb.h>
+
+static int ask_userauth(SSH_SESSION *session){
+ if(session->auth_service_asked)
+ return 0;
+ else {
+ if(ssh_service_request(session,"ssh-userauth"))
+ return -1;
+ else
+ session->auth_service_asked++;
+ }
+ return 0;
+
+}
+
+static void burn(char *ptr){
+ if(ptr)
+ memset(ptr,'X',strlen(ptr));
+}
+
+static void string_burn(STRING *s){
+ memset(s->string,'X',string_len(s));
+}
+
+static int wait_auth_status(SSH_SESSION *session,int kbdint){
+ int err=SSH_AUTH_ERROR;
+ int cont=1;
+ STRING *can_continue;
+ u8 partial=0;
+ char *c_cont;
+ while(cont){
+ if(packet_read(session))
+ break;
+ if(packet_translate(session))
+ break;
+ switch(session->in_packet.type){
+ case SSH2_MSG_USERAUTH_FAILURE:
+ can_continue=buffer_get_ssh_string(session->in_buffer);
+ if(!can_continue || buffer_get_u8(session->in_buffer,&partial)!=1 ){
+ ssh_set_error(session,SSH_INVALID_DATA,"invalid SSH_MSG_USERAUTH_FAILURE message");
+ return SSH_AUTH_ERROR;
+ }
+ c_cont=string_to_char(can_continue);
+ if(partial){
+ err=SSH_AUTH_PARTIAL;
+ ssh_set_error(session,SSH_NO_ERROR,"partial success, authentications that can continue : %s",c_cont);
+ }
+ else {
+ err=SSH_AUTH_DENIED;
+ ssh_set_error(session,SSH_REQUEST_DENIED,"Access denied. authentications that can continue : %s",c_cont);
+ }
+ free(can_continue);
+ free(c_cont);
+ cont=0;
+ break;
+ case SSH2_MSG_USERAUTH_PK_OK:
+ /* SSH monkeys have defined the same number for both */
+ /* SSH_MSG_USERAUTH_PK_OK and SSH_MSG_USERAUTH_INFO_REQUEST */
+ /* which is not really smart; */
+ /*case SSH2_MSG_USERAUTH_INFO_REQUEST: */
+ if(kbdint){
+ err=SSH_AUTH_INFO;
+ cont=0;
+ break;
+ }
+ /* continue through success */
+ case SSH2_MSG_USERAUTH_SUCCESS:
+ err=SSH_AUTH_SUCCESS;
+ cont=0;
+ break;
+ case SSH2_MSG_USERAUTH_BANNER:
+ {
+ STRING *banner=buffer_get_ssh_string(session->in_buffer);
+ if(!banner){
+ ssh_say(1,"The banner message was invalid. continuing though\n");
+ break;
+ }
+ ssh_say(2,"Received a message banner\n");
+ if(session->banner)
+ free(session->banner); /* erase the older one */
+ session->banner=banner;
+ break;
+ }
+ default:
+ packet_parse(session);
+ break;
+ }
+ }
+ return err;
+}
+
+/* use the "none" authentication question */
+
+int ssh_userauth_none(SSH_SESSION *session,char *username){
+ STRING *user;
+ STRING *service;
+ STRING *method;
+ if(!username)
+ if(!(username=session->options->username)){
+ if(options_default_username(session->options))
+ return SSH_AUTH_ERROR;
+ else
+ username=session->options->username;
+ }
+ if(ask_userauth(session))
+ return SSH_AUTH_ERROR;
+ user=string_from_char(username);
+ method=string_from_char("none");
+ service=string_from_char("ssh-connection");
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_REQUEST);
+ buffer_add_ssh_string(session->out_buffer,user);
+ buffer_add_ssh_string(session->out_buffer,service);
+ buffer_add_ssh_string(session->out_buffer,method);
+ free(service);
+ free(method);
+ free(user);
+ packet_send(session);
+ return wait_auth_status(session,0);
+}
+
+int ssh_userauth_offer_pubkey(SSH_SESSION *session, char *username,int type, STRING *publickey){
+ STRING *user;
+ STRING *service;
+ STRING *method;
+ STRING *algo;
+ int err=SSH_AUTH_ERROR;
+ if(!username)
+ if(!(username=session->options->username)){
+ if(options_default_username(session->options))
+ return SSH_AUTH_ERROR;
+ else
+ username=session->options->username;
+ }
+ if(ask_userauth(session))
+ return SSH_AUTH_ERROR;
+ user=string_from_char(username);
+ service=string_from_char("ssh-connection");
+ method=string_from_char("publickey");
+ algo=string_from_char(ssh_type_to_char(type));
+
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_REQUEST);
+ buffer_add_ssh_string(session->out_buffer,user);
+ buffer_add_ssh_string(session->out_buffer,service);
+ buffer_add_ssh_string(session->out_buffer,method);
+ buffer_add_u8(session->out_buffer,0);
+ buffer_add_ssh_string(session->out_buffer,algo);
+ buffer_add_ssh_string(session->out_buffer,publickey);
+ packet_send(session);
+ err=wait_auth_status(session,0);
+ free(user);
+ free(method);
+ free(service);
+ free(algo);
+ return err;
+}
+
+int ssh_userauth_pubkey(SSH_SESSION *session, char *username, STRING *publickey, PRIVATE_KEY *privatekey){
+ STRING *user;
+ STRING *service;
+ STRING *method;
+ STRING *algo;
+ STRING *sign;
+ int err=SSH_AUTH_ERROR;
+ if(!username)
+ if(!(username=session->options->username)){
+ if(options_default_username(session->options))
+ return err;
+ else
+ username=session->options->username;
+ }
+ if(ask_userauth(session))
+ return err;
+ user=string_from_char(username);
+ service=string_from_char("ssh-connection");
+ method=string_from_char("publickey");
+ algo=string_from_char(ssh_type_to_char(privatekey->type));
+
+
+ /* we said previously the public key was accepted */
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_REQUEST);
+ buffer_add_ssh_string(session->out_buffer,user);
+ buffer_add_ssh_string(session->out_buffer,service);
+ buffer_add_ssh_string(session->out_buffer,method);
+ buffer_add_u8(session->out_buffer,1);
+ buffer_add_ssh_string(session->out_buffer,algo);
+ buffer_add_ssh_string(session->out_buffer,publickey);
+ sign=ssh_do_sign(session,session->out_buffer,privatekey);
+ if(sign){
+ buffer_add_ssh_string(session->out_buffer,sign);
+ free(sign);
+ packet_send(session);
+ err=wait_auth_status(session,0);
+ }
+ free(user);
+ free(service);
+ free(method);
+ free(algo);
+ return err;
+}
+
+int ssh_userauth_password(SSH_SESSION *session,char *username,char *password){
+ STRING *user;
+ STRING *service;
+ STRING *method;
+ STRING *password_s;
+ int err;
+ if(!username)
+ if(!(username=session->options->username)){
+ if(options_default_username(session->options))
+ return SSH_AUTH_ERROR;
+ else
+ username=session->options->username;
+ }
+ if(ask_userauth(session))
+ return SSH_AUTH_ERROR;
+ user=string_from_char(username);
+ service=string_from_char("ssh-connection");
+ method=string_from_char("password");
+ password_s=string_from_char(password);
+
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_REQUEST);
+ buffer_add_ssh_string(session->out_buffer,user);
+ buffer_add_ssh_string(session->out_buffer,service);
+ buffer_add_ssh_string(session->out_buffer,method);
+ buffer_add_u8(session->out_buffer,0);
+ buffer_add_ssh_string(session->out_buffer,password_s);
+ free(user);
+ free(service);
+ free(method);
+ memset(password_s,0,strlen(password)+4);
+ free(password_s);
+ packet_send(session);
+ err=wait_auth_status(session,0);
+ return err;
+}
+
+static char *keys_path[]={NULL,"%s/.ssh/identity","%s/.ssh/id_dsa","%s/.ssh/id_rsa",NULL};
+static char *pub_keys_path[]={NULL,"%s/.ssh/identity.pub","%s/.ssh/id_dsa.pub","%s/.ssh/id_rsa.pub",NULL};
+
+/* this function initialy was in the client */
+/* but the fools are the ones who never change mind */
+int ssh_userauth_autopubkey(SSH_SESSION *session, const char *passphrase){
+ int count=1; /* bypass identity */
+ int type=0;
+ int err;
+ STRING *pubkey;
+ char *privkeyfile=NULL;
+ PRIVATE_KEY *privkey;
+ char *id=NULL;
+ /* always testing none */
+ err=ssh_userauth_none(session,NULL);
+ if(err==SSH_AUTH_ERROR || err==SSH_AUTH_SUCCESS){
+ return err;
+ }
+ if(session->options->identity){
+ ssh_say(2,"Trying identity file %s\n",session->options->identity);
+ keys_path[0]=session->options->identity;
+ /* let's hope alloca exists */
+ id=malloc(strlen(session->options->identity)+1 + 4);
+ sprintf(id,"%s.pub",session->options->identity);
+ pub_keys_path[0]=id;
+ count =0;
+ }
+ while((pubkey=publickey_from_next_file(session,pub_keys_path,keys_path, &privkeyfile,&type,&count))){
+ err=ssh_userauth_offer_pubkey(session,NULL,type,pubkey);
+ if(err==SSH_AUTH_ERROR){
+ if(id){
+ pub_keys_path[0]=NULL;
+ keys_path[0]=NULL;
+ free(id);
+ }
+ free(pubkey);
+ return err;
+ } else
+ if(err != SSH_AUTH_SUCCESS){
+ ssh_say(2,"Public key refused by server\n");
+ free(pubkey);
+ continue;
+ }
+ /* pubkey accepted by server ! */
+ privkey=privatekey_from_file(session,privkeyfile,type,passphrase);
+ if (!privkey) {
+ free(pubkey);
+
+ if (passphrase == NULL) {
+ return -666;
+ }
+
+ ssh_say(0, "Private key decryption failed with the provided password (%s).\n", ssh_get_error(session));
+ continue;
+ }
+ err=ssh_userauth_pubkey(session,NULL,pubkey,privkey);
+ if(err==SSH_AUTH_ERROR){
+ if(id){
+ pub_keys_path[0]=NULL;
+ keys_path[0]=NULL;
+ free(id);
+ }
+ free(pubkey);
+ private_key_free(privkey);
+ return err;
+ } else
+ if(err != SSH_AUTH_SUCCESS){
+ ssh_say(0,"Weird : server accepted our public key but refused the signature\nit might be a bug of libssh\n");
+ free(pubkey);
+ private_key_free(privkey);
+ continue;
+ }
+ /* auth success */
+ ssh_say(1,"Authentication using %s success\n",privkeyfile);
+ free(pubkey);
+ private_key_free(privkey);
+ free(privkeyfile);
+ if(id){
+ pub_keys_path[0]=NULL;
+ keys_path[0]=NULL;
+ free(id);
+ }
+ return SSH_AUTH_SUCCESS;
+ }
+ ssh_say(1,"Tried every public key, none matched\n");
+ ssh_set_error(session,SSH_NO_ERROR,"no public key matched");
+ if(id){
+ pub_keys_path[0]=NULL;
+ keys_path[0]=NULL;
+ free(id);
+ }
+
+ return SSH_AUTH_DENIED;
+}
+
+static struct ssh_kbdint *kbdint_new(){
+ struct ssh_kbdint *kbd=malloc(sizeof (struct ssh_kbdint));
+ memset(kbd,0,sizeof(*kbd));
+ return kbd;
+}
+
+
+static void kbdint_free(struct ssh_kbdint *kbd){
+ int i,n=kbd->nprompts;
+ if(kbd->name)
+ free(kbd->name);
+ if(kbd->instruction)
+ free(kbd->instruction);
+ if(kbd->prompts){
+ for(i=0;i<n;++i){
+ burn(kbd->prompts[i]);
+ free(kbd->prompts[i]);
+ }
+ free(kbd->prompts);
+ }
+ if(kbd->answers){
+ for(i=0;i<n;++i){
+ burn(kbd->answers[i]);
+ free(kbd->answers[i]);
+ }
+ free(kbd->answers);
+ }
+ if(kbd->echo){
+ free(kbd->echo);
+ }
+ free(kbd);
+}
+
+static void kbdint_clean(struct ssh_kbdint *kbd){
+ int i,n=kbd->nprompts;
+ if(kbd->name){
+ free(kbd->name);
+ kbd->name=NULL;
+ }
+ if(kbd->instruction){
+ free(kbd->instruction);
+ kbd->instruction=NULL;
+ }
+ if(kbd->prompts){
+ for(i=0;i<n;++i){
+ burn(kbd->prompts[i]);
+ free(kbd->prompts[i]);
+ }
+ free(kbd->prompts);
+ kbd->prompts=NULL;
+ }
+ if(kbd->answers){
+ for(i=0;i<n;++i){
+ burn(kbd->answers[i]);
+ free(kbd->answers[i]);
+ }
+ free(kbd->answers);
+ kbd->answers=NULL;
+ }
+ if(kbd->echo){
+ free(kbd->echo);
+ kbd->echo=NULL;
+ }
+ kbd->nprompts=0;
+}
+
+/* this function sends the first packet as explained in section 3.1
+ * of the draft */
+static int kbdauth_init(SSH_SESSION *session,
+ char *user, char *submethods){
+ STRING *user_s=string_from_char(user);
+ STRING *submethods_s=(submethods ? string_from_char(submethods): string_from_char(""));
+ STRING *service=string_from_char("ssh-connection");
+ STRING *method=string_from_char("keyboard-interactive");
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_REQUEST);
+ buffer_add_ssh_string(session->out_buffer,user_s);
+ buffer_add_ssh_string(session->out_buffer,service);
+ buffer_add_ssh_string(session->out_buffer,method);
+ buffer_add_u32(session->out_buffer,0); /* language tag */
+ buffer_add_ssh_string(session->out_buffer,submethods_s);
+ free(user_s);
+ free(service);
+ free(method);
+ free(submethods_s);
+ if(packet_send(session))
+ return SSH_AUTH_ERROR;
+ return wait_auth_status(session,1);
+}
+
+static int kbdauth_info_get(SSH_SESSION *session){
+ STRING *name; /* name of the "asking" window showed to client */
+ STRING *instruction;
+ STRING *tmp;
+ u32 nprompts;
+ int i;
+ name=buffer_get_ssh_string(session->in_buffer);
+ instruction=buffer_get_ssh_string(session->in_buffer);
+ tmp=buffer_get_ssh_string(session->in_buffer);
+ buffer_get_u32(session->in_buffer,&nprompts);
+ if(!name || !instruction || !tmp){
+ if(name)
+ free(name);
+ if(instruction)
+ free(instruction);
+ /* tmp must be empty if we got here */
+ ssh_set_error(session,SSH_FATAL,"Invalid USERAUTH_INFO_REQUEST msg");
+ return SSH_AUTH_ERROR;
+ }
+ if(tmp)
+ free(tmp); /* no use */
+ if(!session->kbdint)
+ session->kbdint=kbdint_new();
+ else
+ kbdint_clean(session->kbdint);
+ session->kbdint->name=string_to_char(name);
+ free(name);
+ session->kbdint->instruction=string_to_char(instruction);
+ free(instruction);
+ nprompts=ntohl(nprompts);
+ if(nprompts>KBDINT_MAX_PROMPT){
+ ssh_set_error(session,SSH_FATAL,"Too much prompt asked from server: %lu(0x%.8lx)",nprompts,nprompts);
+ return SSH_AUTH_ERROR;
+ }
+ session->kbdint->nprompts=nprompts;
+ session->kbdint->prompts=malloc(nprompts*sizeof(char *));
+ memset(session->kbdint->prompts,0,nprompts*sizeof(char *));
+ session->kbdint->echo=malloc(nprompts);
+ memset(session->kbdint->echo,0,nprompts);
+ for(i=0;i<nprompts;++i){
+ tmp=buffer_get_ssh_string(session->in_buffer);
+ buffer_get_u8(session->in_buffer,&session->kbdint->echo[i]);
+ if(!tmp){
+ ssh_set_error(session,SSH_FATAL,"Short INFO_REQUEST packet");
+ return SSH_AUTH_ERROR;
+ }
+ session->kbdint->prompts[i]=string_to_char(tmp);
+ free(tmp);
+ }
+ return SSH_AUTH_INFO; /* we are not auth. but we parsed the packet */
+}
+
+/* sends challenge back to the server */
+static int kbdauth_send(SSH_SESSION *session) {
+ STRING *answer;
+ int i;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_INFO_RESPONSE);
+ buffer_add_u32(session->out_buffer,htonl(session->kbdint->nprompts));
+ for(i=0;i<session->kbdint->nprompts;++i){
+ if(session->kbdint->answers[i])
+ answer=string_from_char(session->kbdint->answers[i]);
+ else
+ answer=string_from_char("");
+ buffer_add_ssh_string(session->out_buffer,answer);
+ string_burn(answer);
+ free(answer);
+ }
+ if(packet_send(session))
+ return SSH_AUTH_ERROR;
+ return wait_auth_status(session,1);
+}
+
+/* the heart of the whole keyboard interactive login */
+int ssh_userauth_kbdint(SSH_SESSION *session,char *user,char *submethods){
+ int err;
+ if( !session->kbdint){
+ /* first time we call. we must ask for a challenge */
+ if(!user)
+ if(!(user=session->options->username)){
+ if(options_default_username(session->options))
+ return SSH_AUTH_ERROR;
+ else
+ user=session->options->username;
+ }
+ if(ask_userauth(session))
+ return SSH_AUTH_ERROR;
+ err=kbdauth_init(session,user,submethods);
+ if(err!=SSH_AUTH_INFO)
+ return err; /* error or first try success */
+ err=kbdauth_info_get(session);
+ if(err==SSH_AUTH_ERROR){
+ kbdint_free(session->kbdint);
+ session->kbdint=NULL;
+ }
+ return err;
+ }
+ /* if we are at this point, it's because session->kbdint exists */
+ /* it means the user has set some informations there we need to send *
+ * the server. and then we need to ack the status (new questions or ok *
+ * pass in */
+ err=kbdauth_send(session);
+ kbdint_free(session->kbdint);
+ session->kbdint=NULL;
+ if(err!=SSH_AUTH_INFO)
+ return err;
+ err=kbdauth_info_get(session);
+ if(err==SSH_AUTH_ERROR){
+ kbdint_free(session->kbdint);
+ session->kbdint=NULL;
+ }
+ return err;
+}
+
+int ssh_userauth_kbdint_getnprompts(SSH_SESSION *session){
+ return session->kbdint->nprompts;
+}
+
+char *ssh_userauth_kbdint_getname(SSH_SESSION *session){
+ return session->kbdint->name;
+}
+
+char *ssh_userauth_kbdint_getinstruction(SSH_SESSION *session){
+ return session->kbdint->instruction;
+}
+
+char *ssh_userauth_kbdint_getprompt(SSH_SESSION *session, int i,
+ char *echo){
+ if(i > session->kbdint->nprompts)
+ return NULL;
+ if(echo)
+ *echo=session->kbdint->echo[i];
+ return session->kbdint->prompts[i];
+}
+
+void ssh_userauth_kbdint_setanswer(SSH_SESSION *session, unsigned int i, char *answer){
+ if (i>session->kbdint->nprompts)
+ return;
+ if(!session->kbdint->answers){
+ session->kbdint->answers=malloc(sizeof(char*)*session->kbdint->nprompts);
+ memset(session->kbdint->answers,0,sizeof(char *) * session->kbdint->nprompts);
+ }
+ if(session->kbdint->answers[i]){
+ burn(session->kbdint->answers[i]);
+ free(session->kbdint->answers[i]);
+ }
+ session->kbdint->answers[i]=strdup(answer);
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/base64.c b/kftpgrabber/src/misc/libs/ssh/base64.c
new file mode 100644
index 0000000..19db420
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/base64.c
@@ -0,0 +1,210 @@
+/* base64 contains the needed support for base64 alphabet system, */
+/* as described in RFC1521 */
+/*
+Copyright 2003,04 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+/* just the dirtiest part of code i ever made */
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "priv.h"
+static char alphabet[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/" ;
+
+/* transformations */
+#define SET_A(n,i) do { n |= (i&63) <<18; } while (0)
+#define SET_B(n,i) do { n |= (i&63) <<12; } while (0)
+#define SET_C(n,i) do { n |= (i&63) << 6; } while (0)
+#define SET_D(n,i) do { n |= (i&63); } while (0)
+
+#define GET_A(n) ((n & 0xff0000) >> 16)
+#define GET_B(n) ((n & 0xff00) >> 8)
+#define GET_C(n) (n & 0xff)
+
+static int _base64_to_bin(unsigned char dest[3], char *source,int num);
+static int get_equals(char *string);
+
+/* first part : base 64 to binary */
+
+/* base64_to_bin translates a base64 string into a binary one. important, if something went wrong (ie incorrect char)*/
+/* it returns NULL */
+BUFFER *base64_to_bin(char *source){
+ int len;
+ int equals;
+ BUFFER *buffer=buffer_new();
+ unsigned char block[3];
+
+ /* get the number of equals signs, which mirrors the padding */
+ equals=get_equals(source);
+ if(equals>2){
+ buffer_free(buffer);
+ return NULL;
+ }
+
+ len=strlen(source);
+ while(len>4){
+ if(_base64_to_bin(block,source,3)){
+ buffer_free(buffer);
+ return NULL;
+ }
+ buffer_add_data(buffer,block,3);
+ len-=4;
+ source+=4;
+ }
+ /* depending of the number of bytes resting, there are 3 possibilities (from the rfc) */
+ switch(len){
+/* (1) the final quantum of encoding input is an integral
+ multiple of 24 bits; here, the final unit of encoded output will be
+ an integral multiple of 4 characters with no "=" padding */
+ case 4:
+ if(equals!=0){
+ buffer_free(buffer);
+ return NULL;
+ }
+ if(_base64_to_bin(block,source,3)){
+ buffer_free(buffer);
+ return NULL;
+ }
+ buffer_add_data(buffer,block,3);
+ return buffer;
+/*(2) the final quantum of encoding input is exactly 8 bits; here, the final
+ unit of encoded output will be two characters followed by two "="
+ padding characters */
+ case 2:
+ if(equals!=2){
+ buffer_free(buffer);
+ return NULL;
+ }
+ if(_base64_to_bin(block,source,1)){
+ buffer_free(buffer);
+ return NULL;
+ }
+ buffer_add_data(buffer,block,1);
+ return buffer;
+/* the final quantum of encoding input is
+ exactly 16 bits; here, the final unit of encoded output will be three
+ characters followed by one "=" padding character */
+ case 3:
+ if(equals!=1){
+ buffer_free(buffer);
+ return NULL;
+ }
+ if(_base64_to_bin(block,source,2)){
+ buffer_free(buffer);
+ return NULL;
+ }
+ buffer_add_data(buffer,block,2);
+ return buffer;
+ default:
+ /* 4,3,2 are the only padding size allowed */
+ buffer_free(buffer);
+ return NULL;
+ }
+ return NULL;
+}
+
+#define BLOCK(letter,n) do { ptr=strchr(alphabet,source[n]);\
+ if(!ptr) return -1;\
+ i=ptr-alphabet;\
+ SET_##letter(*block,i);\
+ } while(0)
+/* returns 0 if ok, -1 if not (ie invalid char into the stuff) */
+static int to_block4(unsigned long *block, char *source,int num){
+ char *ptr;
+ unsigned int i;
+ *block=0;
+ if(num<1)
+ return 0;
+ BLOCK(A,0); /* 6 bits */
+ BLOCK(B,1); /* 12 */
+ if(num<2)
+ return 0;
+ BLOCK(C,2); /* 18 */
+ if(num < 3)
+ return 0;
+ BLOCK(D,3); /* 24 */
+ return 0;
+}
+
+/* num = numbers of final bytes to be decoded */
+static int _base64_to_bin(unsigned char dest[3], char *source,int num){
+ unsigned long block;
+ if(to_block4(&block,source,num))
+ return -1;
+ dest[0]=GET_A(block);
+ dest[1]=GET_B(block);
+ dest[2]=GET_C(block);
+ return 0;
+}
+
+/* counts the number of "=" signs, and replace them by zeroes */
+static int get_equals(char *string){
+ char *ptr=string;
+ int num=0;
+ while((ptr=strchr(ptr,'='))){
+ num++;
+ *ptr=0;
+ ptr++;
+ }
+
+ return num;
+}
+
+/* thanks sysk for debugging my mess :) */
+#define BITS(n) ((1<<n)-1)
+static void _bin_to_base64(unsigned char *dest, unsigned char source[3], int len){
+ switch (len){
+ case 1:
+ dest[0]=alphabet[(source[0]>>2)];
+ dest[1]=alphabet[((source[0] & BITS(2)) << 4)];
+ dest[2]='=';
+ dest[3]='=';
+ break;
+ case 2:
+ dest[0]=alphabet[source[0]>>2];
+ dest[1]=alphabet[(source[1]>>4) | ((source[0] & BITS(2)) << 4)];
+ dest[2]=alphabet[(source[1]&BITS(4)) << 2];
+ dest[3]='=';
+ break;
+ case 3:
+ dest[0]=alphabet[(source[0]>>2)];
+ dest[1]=alphabet[(source[1]>>4) | ((source[0] & BITS(2)) << 4)];
+ dest[2]=alphabet[ (source[2] >> 6) | (source[1]&BITS(4)) << 2];
+ dest[3]=alphabet[source[2]&BITS(6)];
+ break;
+ }
+}
+
+char *bin_to_base64(unsigned char *source, int len){
+ int flen=len + (3 - (len %3)); /* round to upper 3 multiple */
+ char *buffer;
+ char *ptr;
+ flen=(4 * flen)/3 + 1 ;
+ ptr=buffer=malloc(flen);
+ while(len>0){
+ _bin_to_base64(ptr,source,len>3?3:len);
+ ptr+=4;
+ source +=3;
+ len -=3;
+ }
+ ptr[0]=0;
+ return buffer;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/buffer.c b/kftpgrabber/src/misc/libs/ssh/buffer.c
new file mode 100644
index 0000000..8d54e3c
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/buffer.c
@@ -0,0 +1,161 @@
+/* buffer.c */
+/* Well, buffers */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+#include "priv.h"
+BUFFER *buffer_new(){
+ BUFFER *buffer=malloc(sizeof(BUFFER));
+ memset(buffer,0,sizeof(BUFFER));
+ return buffer;
+ }
+
+void buffer_free(BUFFER *buffer){
+ if(buffer->data){
+ memset(buffer->data,0,buffer->allocated); /* burn the data */
+ free(buffer->data);
+ }
+ free(buffer);
+ }
+
+void buffer_reinit(BUFFER *buffer){
+ memset(buffer->data,0,buffer->used);
+ buffer->used=0;
+ buffer->pos=0;
+}
+
+static void realloc_buffer(BUFFER *buffer,int needed){
+ needed=(needed+0x7f) & ~0x7f;
+ buffer->data=realloc(buffer->data,needed);
+ buffer->allocated=needed;
+}
+
+void buffer_add_data(BUFFER *buffer,void *data,int len){
+ if(buffer->allocated < buffer->used+len)
+ realloc_buffer(buffer,buffer->used+len);
+ memcpy(buffer->data+buffer->used,data,len);
+ buffer->used+=len;
+ }
+
+void buffer_add_ssh_string(BUFFER *buffer,STRING *string){
+ u32 len=ntohl(string->size);
+ buffer_add_data(buffer,string,len+sizeof(u32));
+ }
+
+void buffer_add_u32(BUFFER *buffer,u32 data){
+ buffer_add_data(buffer,&data,sizeof(data));
+}
+
+void buffer_add_u64(BUFFER *buffer,u64 data){
+ buffer_add_data(buffer,&data,sizeof(data));
+}
+
+void buffer_add_u8(BUFFER *buffer,u8 data){
+ buffer_add_data(buffer,&data,sizeof(u8));
+}
+
+void buffer_add_data_begin(BUFFER *buffer, void *data, int len){
+ if(buffer->allocated < buffer->used + len)
+ realloc_buffer(buffer,buffer->used+len);
+ memmove(buffer->data+len,buffer->data,buffer->used);
+ memcpy(buffer->data,data,len);
+ buffer->used+=len;
+}
+
+void buffer_add_buffer(BUFFER *buffer, BUFFER *source){
+ buffer_add_data(buffer,buffer_get(source),buffer_get_len(source));
+}
+
+void *buffer_get(BUFFER *buffer){
+ return buffer->data;
+}
+
+void *buffer_get_rest(BUFFER *buffer){
+ return buffer->data+buffer->pos;
+}
+
+int buffer_get_len(BUFFER *buffer){
+ return buffer->used;
+}
+
+int buffer_get_rest_len(BUFFER *buffer){
+ return buffer->used - buffer->pos;
+}
+
+int buffer_pass_bytes(BUFFER *buffer,int len){
+ if(buffer->used < buffer->pos+len)
+ return 0;
+ buffer->pos+=len;
+ /* if the buffer is empty after having passed the whole bytes into it, we can clean it */
+ if(buffer->pos==buffer->used){
+ buffer->pos=0;
+ buffer->used=0;
+ }
+ return len;
+}
+
+int buffer_pass_bytes_end(BUFFER *buffer,int len){
+ if(buffer->used < buffer->pos + len)
+ return 0;
+ buffer->used-=len;
+ return len;
+}
+
+int buffer_get_data(BUFFER *buffer, void *data, int len){
+ if(buffer->pos+len>buffer->used)
+ return 0; /*no enough data in buffer */
+ memcpy(data,buffer->data+buffer->pos,len);
+ buffer->pos+=len;
+ return len; /* no yet support for partial reads (is it really needed ?? ) */
+}
+
+int buffer_get_u8(BUFFER *buffer, u8 *data){
+ return buffer_get_data(buffer,data,sizeof(u8));
+}
+
+int buffer_get_u32(BUFFER *buffer, u32 *data){
+ return buffer_get_data(buffer,data,sizeof(u32));
+}
+
+int buffer_get_u64(BUFFER *buffer, u64 *data){
+ return buffer_get_data(buffer,data,sizeof(u64));
+}
+
+STRING *buffer_get_ssh_string(BUFFER *buffer){
+ u32 stringlen;
+ u32 hostlen;
+ STRING *str;
+ if(buffer_get_u32(buffer,&stringlen)==0)
+ return NULL;
+ hostlen=ntohl(stringlen);
+ /* verify if there is enough space in buffer to get it */
+ if(buffer->pos+hostlen>buffer->used)
+ return 0; /* it is indeed */
+ str=string_new(hostlen);
+ if(buffer_get_data(buffer,str->string,hostlen)!=hostlen){
+ ssh_say(0,"buffer_get_ssh_string: oddish : second test failed when first was successful. len=%d",hostlen);
+ free(str);
+ return NULL;
+ }
+ return str;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/channels.c b/kftpgrabber/src/misc/libs/ssh/channels.c
new file mode 100644
index 0000000..9dd94d4
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/channels.c
@@ -0,0 +1,691 @@
+/* channels.c */
+/* It has support for ... ssh channels */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <string.h>
+#include <stdlib.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <stdio.h>
+
+#include "priv.h"
+#include "ssh2.h"
+#define WINDOWLIMIT 1024
+#define WINDOWBASE 32000
+static void channel_default_bufferize(CHANNEL *channel, void *data, int len, int is_stderr);
+static CHANNEL *new_channel(SSH_SESSION *session){
+ CHANNEL *channel=malloc(sizeof(CHANNEL));
+ memset(channel,0,sizeof(CHANNEL));
+ channel->session=session;
+ if(!session->channels){
+ session->channels=channel;
+ channel->next=channel->prev=channel;
+ return channel;
+ }
+ channel->next=session->channels;
+ channel->prev=session->channels->prev;
+ channel->next->prev=channel;
+ channel->prev->next=channel;
+ return channel;
+}
+
+static u32 channel_new_id(SSH_SESSION *session){
+ u32 ret=session->maxchannel;
+ session->maxchannel++;
+ return ret;
+}
+
+static CHANNEL *channel_open(SSH_SESSION *session,char *type_c,int window,
+int maxpacket,BUFFER *payload){
+ CHANNEL *channel=new_channel(session);
+ STRING *type=string_from_char(type_c);
+ u32 foo;
+ int err;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_OPEN);
+ channel->local_channel=channel_new_id(session);
+ channel->local_maxpacket=maxpacket;
+ channel->local_window=window;
+ ssh_say(2,"creating a channel %d with %d window and %d max packet\n",channel->local_channel,
+ window,maxpacket);
+ buffer_add_ssh_string(session->out_buffer,type);
+ buffer_add_u32(session->out_buffer,htonl(channel->local_channel));
+ buffer_add_u32(session->out_buffer,htonl(channel->local_window));
+ buffer_add_u32(session->out_buffer,htonl(channel->local_maxpacket));
+ free(type);
+ if(payload)
+ buffer_add_buffer(session->out_buffer,payload);
+ packet_send(session);
+ ssh_say(2,"Sent a SSH_MSG_CHANNEL_OPEN type %s for channel %d\n",type_c,channel->local_channel);
+ err=packet_wait(session,SSH2_MSG_CHANNEL_OPEN_CONFIRMATION,1);
+ switch(session->in_packet.type){
+ case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:
+ buffer_get_u32(session->in_buffer,&foo);
+ if(channel->local_channel!=ntohl(foo)){
+ ssh_set_error(session,SSH_INVALID_DATA,"server answered with sender chan num %d instead of given %d",
+ ntohl(foo),channel->local_channel);
+ channel_free(channel);
+ return NULL;
+ }
+ buffer_get_u32(session->in_buffer,&foo);
+ channel->remote_channel=ntohl(foo);
+ buffer_get_u32(session->in_buffer,&foo);
+ channel->remote_window=ntohl(foo);
+ buffer_get_u32(session->in_buffer,&foo);
+ channel->remote_maxpacket=ntohl(foo);
+ ssh_say(3,"Received a CHANNEL_OPEN_CONFIRMATION for channel %d:%d\n",
+ channel->local_channel,channel->remote_channel);
+ ssh_say(3,"Remote window : %ld, maxpacket : %ld\n",
+ channel->remote_window, channel->remote_maxpacket);
+ channel->open=1;
+ return channel;
+ case SSH2_MSG_CHANNEL_OPEN_FAILURE:
+ {
+ u32 code;
+ STRING *error_s;
+ char *error;
+ buffer_get_u32(session->in_buffer,&foo);
+ buffer_get_u32(session->in_buffer,&code);
+ error_s=buffer_get_ssh_string(session->in_buffer);
+ error=string_to_char(error_s);
+ ssh_set_error(session,SSH_REQUEST_DENIED,"Channel opening failure : channel %d error (%d) %s",
+ channel->local_channel,ntohl(code),error);
+ free(error);
+ free(error_s);
+ channel_free(channel);
+ return NULL;
+ }
+ default:
+ ssh_say(0,"Received unknown packet %d\n",session->in_packet.type);
+ channel_free(channel);
+ return NULL;
+ }
+ return NULL;
+}
+
+static CHANNEL *find_local_channel(SSH_SESSION *session,u32 num){
+ /* we assume we are always the local */
+ CHANNEL *initchan,*channel;
+ initchan=session->channels;
+ if(!initchan)
+ return NULL;
+ for(channel=initchan;channel->local_channel!=num;channel=channel->next){
+ if(channel->next==initchan)
+ return NULL;
+ }
+ return channel;
+}
+
+static void grow_window(SSH_SESSION *session, CHANNEL *channel){
+ u32 new_window=WINDOWBASE;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_WINDOW_ADJUST);
+ buffer_add_u32(session->out_buffer,htonl(channel->remote_channel));
+ buffer_add_u32(session->out_buffer,htonl(new_window));
+ packet_send(session);
+ ssh_say(3,"growing window (channel %d:%d) to %d bytes\n",
+ channel->local_channel,channel->remote_channel,
+ channel->local_window + new_window);
+ channel->local_window+=new_window;
+}
+
+static CHANNEL *channel_from_msg(SSH_SESSION *session){
+ u32 chan;
+ CHANNEL *channel;
+ if (buffer_get_u32(session->in_buffer,&chan)!=sizeof(u32)){
+ ssh_set_error(session,SSH_FATAL,"Getting channel from message : short read");
+ return NULL;
+ }
+ channel=find_local_channel(session,ntohl(chan));
+ if(!channel)
+ ssh_set_error(session,SSH_FATAL,"Server specified invalid channel %d",ntohl(chan));
+ return channel;
+}
+
+static void channel_rcv_change_window(SSH_SESSION *session){
+ u32 bytes;
+ CHANNEL *channel;
+ int err;
+ channel=channel_from_msg(session);
+ if(!channel)
+ ssh_say(0,"%s\n",ssh_get_error(session));
+ err = buffer_get_u32(session->in_buffer,&bytes);
+ if(!channel || err!= sizeof(u32)){
+ ssh_say(1,"Error getting a window adjust message : invalid packet\n");
+ return;
+ }
+ bytes=ntohl(bytes);
+ ssh_say(3,"Adding %d bytes to channel (%d:%d) (from %d bytes)\n",bytes,
+ channel->local_channel,channel->remote_channel,channel->remote_window);
+ channel->remote_window+=bytes;
+}
+
+/* is_stderr is set to 1 if the data are extended, ie stderr */
+static void channel_rcv_data(SSH_SESSION *session,int is_stderr){
+ STRING *str;
+ CHANNEL *channel;
+ channel=channel_from_msg(session);
+ if(!channel){
+ ssh_say(0,"%s",ssh_get_error(session));
+ return;
+ }
+ if(is_stderr){
+ u32 ignore;
+ /* uint32 data type code. we can ignore it */
+ buffer_get_u32(session->in_buffer,&ignore);
+ }
+ str=buffer_get_ssh_string(session->in_buffer);
+
+ if(!str){
+ ssh_say(0,"Invalid data packet !\n");
+ return;
+ }
+ ssh_say(3,"adding %d bytes data in %d\n",string_len(str),is_stderr);
+ /* what shall we do in this case ? let's accept it anyway */
+ if(string_len(str)>channel->local_window)
+ ssh_say(0,"Data packet too big for our window(%d vs %d)",string_len(str),channel->local_window);
+ if(!is_stderr){
+ /* stdout */
+ if(channel->write_fct){
+ channel->write_fct(channel,str->string,string_len(str),channel->userarg);
+ } else {
+ channel_default_bufferize(channel,str->string,string_len(str),is_stderr);
+ }
+ } else {
+ /* stderr */
+ if(channel->write_err_fct){
+ channel->write_err_fct(channel,str->string,string_len(str),channel->userarg);
+ } else {
+ channel_default_bufferize(channel,str->string,string_len(str),is_stderr);
+ }
+ }
+ if(string_len(str)>=channel->local_window)
+ channel->local_window-=string_len(str);
+ else
+ channel->local_window=0; /* buggy remote */
+ if(channel->local_window < WINDOWLIMIT)
+ grow_window(session,channel); /* i wonder if this is the correct place to do that */
+ free(str);
+}
+
+static void channel_rcv_eof(SSH_SESSION *session){
+ CHANNEL *channel;
+ channel=channel_from_msg(session);
+ if(!channel){
+ ssh_say(0,"%s\n",ssh_get_error(session));
+ return;
+ }
+ ssh_say(2,"Received eof on channel (%d:%d)\n",channel->local_channel,
+ channel->remote_channel);
+/* channel->remote_window=0; */
+ channel->remote_eof=1;
+}
+
+static void channel_rcv_close(SSH_SESSION *session){
+ CHANNEL *channel;
+ channel=channel_from_msg(session);
+ if(!channel){
+ ssh_say(0,"%s\n",ssh_get_error(session));
+ return;
+ }
+ ssh_say(2,"Received close on channel (%d:%d)\n",channel->local_channel,
+ channel->remote_channel);
+ channel->open=0;
+ if(!channel->remote_eof)
+ ssh_say(2,"Remote host not polite enough to send an eof before close\n");
+ channel->remote_eof=1;
+}
+
+static void channel_rcv_request(SSH_SESSION *session){
+ STRING *request_s;
+ char *request;
+ u32 status;
+ CHANNEL *channel=channel_from_msg(session);
+ if(!channel){
+ ssh_say(1,"%s\n",ssh_get_error(session));
+ return;
+ }
+ request_s=buffer_get_ssh_string(session->in_buffer);
+ if(!request_s){
+ ssh_say(0,"Invalid MSG_CHANNEL_REQUEST\n");
+ return;
+ }
+ buffer_get_u8(session->in_buffer,(u8 *)&status);
+ request=string_to_char(request_s);
+ if(!strcmp(request,"exit-status")){
+ buffer_get_u32(session->in_buffer,&status);
+ status=ntohl(status);
+/* XXX do something with status, we might need it */
+ free(request_s);
+ free(request);
+ return ;
+ }
+ if(!strcmp(request,"exit-signal")){
+ STRING *signal_s;
+ char *signal;
+ char *core="(core dumped)";
+ u8 i;
+ signal_s=buffer_get_ssh_string(session->in_buffer);
+ if(!signal_s){
+ ssh_say(0,"Invalid MSG_CHANNEL_REQUEST\n");
+ free(request_s);
+ free(request);
+ return;
+ }
+ signal=string_to_char(signal_s);
+ buffer_get_u8(session->in_buffer,&i);
+ if(!i)
+ core="";
+ ssh_say(0,"Remote connection closed by signal SIG%s %s\n",signal,core);
+ free(signal_s);
+ free(signal);
+ free(request_s);
+ free(request);
+ return;
+ }
+ ssh_say(0,"Unknown request %s\n",request);
+ free(request_s);
+ free(request);
+}
+
+/* channel_handle is called by wait_packet, ie, when there is channel informations to handle . */
+void channel_handle(SSH_SESSION *session, int type){
+ ssh_say(3,"Channel_handle(%d)\n",type);
+ switch(type){
+ case SSH2_MSG_CHANNEL_WINDOW_ADJUST:
+ channel_rcv_change_window(session);
+ break;
+ case SSH2_MSG_CHANNEL_DATA:
+ channel_rcv_data(session,0);
+ break;
+ case SSH2_MSG_CHANNEL_EXTENDED_DATA:
+ channel_rcv_data(session,1);
+ break;
+ case SSH2_MSG_CHANNEL_EOF:
+ channel_rcv_eof(session);
+ break;
+ case SSH2_MSG_CHANNEL_CLOSE:
+ channel_rcv_close(session);
+ break;
+ case SSH2_MSG_CHANNEL_REQUEST:
+ channel_rcv_request(session);
+ break;
+ default:
+ ssh_say(0,"Unexpected message %d\n",type);
+ }
+}
+
+/* when data has been received from the ssh server, it can be applied to the known
+ user function, with help of the callback, or inserted here */
+/* XXX is the window changed ? */
+static void channel_default_bufferize(CHANNEL *channel, void *data, int len, int is_stderr){
+ ssh_say(3,"placing %d bytes into channel buffer (stderr=%d)\n",len,is_stderr);
+ if(!is_stderr){
+ /* stdout */
+ if(!channel->stdout_buffer)
+ channel->stdout_buffer=buffer_new();
+ buffer_add_data(channel->stdout_buffer,data,len);
+ } else {
+ /* stderr */
+ if(!channel->stderr_buffer)
+ channel->stderr_buffer=buffer_new();
+ buffer_add_data(channel->stderr_buffer,data,len);
+ }
+}
+
+
+/* --8<-- PUBLIC INTERFACE BEGINS HERE -8<-----8< --- */
+
+/* deprecated */
+CHANNEL *open_session_channel(SSH_SESSION *session,int window,int maxpacket){
+ CHANNEL *chan=channel_open(session,"session",window,maxpacket,NULL);
+ return chan;
+}
+
+CHANNEL *channel_open_session(SSH_SESSION *session){
+ return open_session_channel(session,64000,32000);
+}
+
+/* tcpip forwarding */
+CHANNEL *channel_open_forward(SSH_SESSION *session,char *remotehost, int remoteport, char *sourcehost, int localport){
+ CHANNEL *chan;
+ BUFFER *payload=buffer_new();
+ STRING *str=string_from_char(remotehost);
+ buffer_add_ssh_string(payload,str);
+ free(str);
+ str=string_from_char(sourcehost);
+ buffer_add_u32(payload,htonl(remoteport));
+ buffer_add_ssh_string(payload,str);
+ free(str);
+ buffer_add_u32(payload,htonl(localport));
+ chan=channel_open(session,"direct-tcpip",64000,32000,payload);
+ buffer_free(payload);
+ return chan;
+}
+
+
+void channel_free(CHANNEL *channel){
+ SSH_SESSION *session=channel->session;
+ if(session->alive && channel->open)
+ channel_close(channel);
+ /* handle the "my channel is first on session list" case */
+ if(session->channels==channel)
+ session->channels=channel->next;
+ /* handle the "my channel is the only on session list" case */
+ if(channel->next == channel){
+ session->channels=NULL;
+ } else {
+ channel->prev->next=channel->next;
+ channel->next->prev=channel->prev;
+ }
+ if(channel->stdout_buffer)
+ buffer_free(channel->stdout_buffer);
+ if(channel->stderr_buffer)
+ buffer_free(channel->stderr_buffer);
+ /* debug trick to catch use after frees */
+ memset(channel,'X',sizeof(CHANNEL));
+ free(channel);
+}
+
+int channel_send_eof(CHANNEL *channel){
+ SSH_SESSION *session=channel->session;
+ int ret;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_EOF);
+ buffer_add_u32(session->out_buffer,htonl(channel->remote_channel));
+ ret=packet_send(session);
+ ssh_say(1,"Sent a EOF on client channel (%d:%d)\n",channel->local_channel,
+ channel->remote_channel);
+ channel->local_eof=1;
+ return ret;
+}
+
+int channel_close(CHANNEL *channel){
+ SSH_SESSION *session=channel->session;
+ int ret=0;
+ if(!channel->local_eof)
+ ret=channel_send_eof(channel);
+ if(ret)
+ return ret;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_CLOSE);
+ buffer_add_u32(session->out_buffer,htonl(channel->remote_channel));
+ ret=packet_send(session);
+ ssh_say(1,"Sent a close on client channel (%d:%d)\n",channel->local_channel,
+ channel->remote_channel);
+ if(!ret)
+ channel->open =0;
+ return ret;
+}
+
+/* Blocking write */
+/* The exact len is written */
+int channel_write(CHANNEL *channel ,void *data,int len){
+ SSH_SESSION *session=channel->session;
+ int effectivelen;
+ int origlen=len;
+ if(channel->local_eof){
+ ssh_set_error(session,SSH_REQUEST_DENIED,"Can't write to channel %d:%d"
+ " after EOF was sent",channel->local_channel,channel->remote_channel);
+ return -1;
+ }
+ while(len >0){
+ if(channel->remote_window<len){
+ ssh_say(2,"Remote window is %d bytes. going to write %d bytes\n",
+ channel->remote_window,len);
+ ssh_say(2,"Waiting for a growing window message...\n");
+ /* wonder what happens when the channel window is zero */
+ while(channel->remote_window==0){
+ /* parse every incoming packet */
+ packet_wait(channel->session,0,0);
+ }
+ effectivelen=len>channel->remote_window?channel->remote_window:len;
+ } else
+ effectivelen=len;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_DATA);
+ buffer_add_u32(session->out_buffer,htonl(channel->remote_channel));
+ buffer_add_u32(session->out_buffer,htonl(effectivelen));
+ buffer_add_data(session->out_buffer,data,effectivelen);
+ packet_send(session);
+ ssh_say(2,"channel_write wrote %d bytes\n",effectivelen);
+ channel->remote_window-=effectivelen;
+ len -= effectivelen;
+ data+=effectivelen;
+ }
+ return origlen;
+}
+
+int channel_is_open(CHANNEL *channel){
+ return (channel->open!=0);
+}
+
+
+static int channel_request(CHANNEL *channel,char *request, BUFFER *buffer,int reply){
+ STRING *request_s=string_from_char(request);
+ SSH_SESSION *session=channel->session;
+ int err;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_CHANNEL_REQUEST);
+ buffer_add_u32(session->out_buffer,htonl(channel->remote_channel));
+ buffer_add_ssh_string(session->out_buffer,request_s);
+ buffer_add_u8(session->out_buffer,reply?1:0);
+ if(buffer)
+ buffer_add_data(session->out_buffer,buffer_get(buffer),buffer_get_len(buffer));
+ packet_send(session);
+ ssh_say(3,"Sent a SSH_MSG_CHANNEL_REQUEST %s\n",request);
+ free(request_s);
+ if(!reply)
+ return 0;
+ err=packet_wait(session,SSH2_MSG_CHANNEL_SUCCESS,1);
+ if(err)
+ if(session->in_packet.type==SSH2_MSG_CHANNEL_FAILURE){
+ ssh_say(2,"%s channel request failed\n",request);
+ ssh_set_error(session,SSH_REQUEST_DENIED,"Channel request %s failed",request);
+ }
+ else
+ ssh_say(3,"Received an unexpected %d message\n",session->in_packet.type);
+ else
+ ssh_say(3,"Received a SUCCESS\n");
+ return err;
+}
+
+int channel_request_pty_size(CHANNEL *channel, char *terminal, int col, int row){
+ STRING *term=string_from_char(terminal);
+ BUFFER *buffer=buffer_new();
+ int err;
+ buffer_add_ssh_string(buffer,term);
+ buffer_add_u32(buffer,htonl(col));
+ buffer_add_u32(buffer,htonl(row));
+ buffer_add_u32(buffer,0);
+ buffer_add_u32(buffer,0);
+/* a 0byte string */
+ buffer_add_u32(buffer,htonl(1));
+ buffer_add_u8(buffer,0);
+ free(term);
+ err=channel_request(channel,"pty-req",buffer,1);
+ buffer_free(buffer);
+ return err;
+}
+
+int channel_request_pty(CHANNEL *channel){
+ return channel_request_pty_size(channel,"xterm",80,24);
+}
+
+int channel_change_pty_size(CHANNEL *channel,int cols,int rows){
+ BUFFER *buffer=buffer_new();
+ int err;
+ /*buffer_add_u8(buffer,0);*/
+ buffer_add_u32(buffer,htonl(cols));
+ buffer_add_u32(buffer,htonl(rows));
+ buffer_add_u32(buffer,0);
+ buffer_add_u32(buffer,0);
+ err=channel_request(channel,"window-change",buffer,0);
+ buffer_free(buffer);
+ return err;
+}
+
+int channel_request_shell(CHANNEL *channel){
+ int err=channel_request(channel,"shell",NULL,1);
+ return err;
+}
+
+int channel_request_subsystem(CHANNEL *channel, char *system){
+ BUFFER* buffer=buffer_new();
+ int ret;
+ STRING *subsystem=string_from_char(system);
+ buffer_add_ssh_string(buffer,subsystem);
+ free(subsystem);
+ ret=channel_request(channel,"subsystem",buffer,1);
+ buffer_free(buffer);
+ return ret;
+}
+
+int channel_request_sftp( CHANNEL *channel){
+ return channel_request_subsystem(channel, "sftp");
+}
+
+
+int channel_request_env(CHANNEL *channel,char *name, char *value){
+ BUFFER *buffer=buffer_new();
+ int ret;
+ STRING *string=string_from_char(name);
+ buffer_add_ssh_string(buffer,string);
+ free(string);
+ string=string_from_char(value);
+ buffer_add_ssh_string(buffer,string);
+ free(string);
+ ret=channel_request(channel,"env",buffer,1);
+ buffer_free(buffer);
+ return ret;
+}
+
+int channel_request_exec(CHANNEL *channel, char *cmd){
+ BUFFER *buffer=buffer_new();
+ int ret;
+ STRING *command=string_from_char(cmd);
+ buffer_add_ssh_string(buffer,command);
+ free(command);
+ ret=channel_request(channel,"exec",buffer,1);
+ buffer_free(buffer);
+ return ret;
+}
+
+int channel_set_write_handler(CHANNEL *chan,
+ void (*write_fct)(CHANNEL *channel, void *data, int len, void *userdefined),void *user){
+ chan->write_fct=write_fct;
+ chan->userarg=user;
+ return 0;
+}
+
+int channel_set_stderr_write_handler(CHANNEL *chan,
+ void (*write_err_fct)(CHANNEL *channel, void *data, int len, void *userdefined),void *user){
+ chan->write_err_fct=write_err_fct;
+ chan->userarg=user;
+ return 0;
+}
+
+
+/* reads into a channel and put result into buffer */
+/* returns number of bytes read, 0 if eof or such and -1 in case of error */
+/* if bytes != 0, the exact number of bytes are going to be read */
+int channel_read(CHANNEL *channel, BUFFER *buffer,int bytes,int is_stderr){
+ BUFFER *stdbuf=NULL;
+ int len;
+ buffer_reinit(buffer);
+ /* maybe i should always set a buffer to avoid races between channel_default_bufferize and channel_read */
+ if(channel->write_fct){
+ ssh_set_error(channel->session,SSH_INVALID_REQUEST,"Specified channel hasn't got a default buffering system\n");
+ return -1;
+ }
+ if(is_stderr){
+ if(!channel->stderr_buffer)
+ channel->stderr_buffer=buffer_new();
+ stdbuf=channel->stderr_buffer;
+ } else {
+ if(!channel->stdout_buffer)
+ channel->stdout_buffer=buffer_new();
+ stdbuf=channel->stdout_buffer;
+ }
+ /* block reading if asked bytes=0 */
+ while((buffer_get_rest_len(stdbuf)==0) || (buffer_get_rest_len(stdbuf) < bytes)){
+ if(channel->remote_eof && buffer_get_rest_len(stdbuf)==0)
+ return 0;
+ if(channel->remote_eof)
+ break; /* return the resting bytes in buffer */
+ if(packet_read(channel->session)||packet_translate(channel->session))
+ return -1;
+ packet_parse(channel->session);
+ }
+
+ if(bytes==0){
+ /* write the ful buffer informations */
+ buffer_add_data(buffer,buffer_get_rest(stdbuf),buffer_get_rest_len(stdbuf));
+ buffer_reinit(stdbuf);
+ } else {
+ len=buffer_get_rest_len(stdbuf);
+ len= (len>bytes?bytes:len); /* read bytes bytes if len is greater, everything otherwise */
+ buffer_add_data(buffer,buffer_get_rest(stdbuf),len);
+ buffer_pass_bytes(stdbuf,len);
+ }
+ return buffer_get_len(buffer);
+}
+
+/* returns the number of bytes available, 0 if nothing is currently available, -1 if error */
+int channel_poll(CHANNEL *channel, int is_stderr){
+ BUFFER *buffer;
+ if(is_stderr){
+ buffer=channel->stderr_buffer;
+ if(!buffer)
+ buffer=channel->stderr_buffer=buffer_new();
+ } else {
+ buffer=channel->stdout_buffer;
+ if(!buffer)
+ buffer=channel->stdout_buffer=buffer_new();
+ }
+ while(buffer_get_len(buffer)==0){
+ if(ssh_fd_poll(channel->session)){
+ if(packet_read(channel->session)||packet_translate(channel->session))
+ return -1;
+ packet_parse(channel->session);
+ } else
+ return 0; /* nothing is available has said fd_poll */
+ }
+ return buffer_get_len(buffer);
+}
+
+/* nonblocking read on the specified channel. it will return <=len bytes of data read
+ atomicly. */
+int channel_read_nonblocking(CHANNEL *channel, char *dest, int len, int is_stderr){
+ int to_read=channel_poll(channel,is_stderr);
+ int lu;
+ BUFFER *buffer=buffer_new();
+ if(to_read<=0){
+ buffer_free(buffer);
+ return to_read; /* may be an error code */
+ }
+ if(to_read>len)
+ to_read=len;
+ lu=channel_read(channel,buffer,to_read,is_stderr);
+ memcpy(dest,buffer_get(buffer),lu>=0?lu:0);
+ buffer_free(buffer);
+ return lu;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/client.c b/kftpgrabber/src/misc/libs/ssh/client.c
new file mode 100644
index 0000000..a7a7569
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/client.c
@@ -0,0 +1,261 @@
+/* client.c file */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netdb.h>
+#include "priv.h"
+#include "ssh2.h"
+static void ssh_cleanup(SSH_SESSION *session);
+#define set_status(opt,status) do {\
+ if (opt->connect_status_function) \
+ opt->connect_status_function(opt->connect_status_arg, status); \
+ } while (0)
+/* simply gets a banner from a socket */
+char *ssh_get_banner(SSH_SESSION *session){
+ char buffer[128];
+ int i = 0;
+ while (i < 127) {
+ if(read(session->fd, &buffer[i], 1)<=0){
+ ssh_set_error(session,SSH_CONNECTION_LOST,"Remote host closed connection");
+ return NULL;
+ }
+ if (buffer[i] == '\r')
+ buffer[i] = 0;
+ if (buffer[i] == '\n') {
+ buffer[i] = 0;
+ return strdup(buffer);
+ }
+ i++;
+ }
+ ssh_set_error(NULL,SSH_FATAL,"Too large banner");
+ return NULL;
+}
+
+/* ssh_send_banner sends a SSH banner to the server */
+/* TODO select a banner compatible with server version */
+/* switch SSH1/1.5/2 */
+/* and quit when the server is SSH1 only */
+
+void ssh_send_banner(SSH_SESSION *session){
+ char *banner=CLIENTBANNER ;
+ char buffer[128];
+ if(session->options->clientbanner)
+ banner=session->options->clientbanner;
+ session->clientbanner=strdup(banner);
+ snprintf(buffer,128,"%s\r\n",session->clientbanner);
+ write(session->fd,buffer,strlen(buffer));
+}
+
+
+int dh_handshake(SSH_SESSION *session){
+ STRING *e,*f,*pubkey,*signature;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_KEXDH_INIT);
+ dh_generate_x(session);
+ dh_generate_e(session);
+ e=dh_get_e(session);
+ buffer_add_ssh_string(session->out_buffer,e);
+ packet_send(session);
+ free(e);
+ if(packet_wait(session,SSH2_MSG_KEXDH_REPLY,1))
+ return -1;
+ pubkey=buffer_get_ssh_string(session->in_buffer);
+ if(!pubkey){
+ ssh_set_error(NULL,SSH_FATAL,"No public key in packet");
+ return -1;
+ }
+ dh_import_pubkey(session,pubkey);
+ f=buffer_get_ssh_string(session->in_buffer);
+ if(!f){
+ ssh_set_error(NULL,SSH_FATAL,"No F number in packet");
+ return -1;
+ }
+ dh_import_f(session,f);
+ free(f);
+ if(!(signature=buffer_get_ssh_string(session->in_buffer))){
+ ssh_set_error(NULL,SSH_FATAL,"No signature in packet");
+ return -1;
+ }
+
+ dh_build_k(session);
+ packet_wait(session,SSH2_MSG_NEWKEYS,1);
+ ssh_say(2,"Got SSH_MSG_NEWKEYS\n");
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_NEWKEYS);
+ packet_send(session);
+ ssh_say(2,"SSH_MSG_NEWKEYS sent\n");
+ make_sessionid(session);
+ /* set the cryptographic functions for the next crypto (it is needed for generate_session_keys for key lenghts) */
+ if(crypt_set_algorithms(session))
+ return -1;
+ generate_session_keys(session);
+ /* verify the host's signature. XXX do it sooner */
+ if(signature_verify(session,signature)){
+ free(signature);
+ return -1;
+ }
+ free(signature); /* forget it for now ... */
+ /* once we got SSH2_MSG_NEWKEYS we can switch next_crypto and current_crypto */
+ if(session->current_crypto)
+ crypto_free(session->current_crypto);
+ /* XXX later, include a function to change keys */
+ session->current_crypto=session->next_crypto;
+ session->next_crypto=crypto_new();
+ return 0;
+}
+
+int ssh_service_request(SSH_SESSION *session,char *service){
+ STRING *service_s;
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_SERVICE_REQUEST);
+ service_s=string_from_char(service);
+ buffer_add_ssh_string(session->out_buffer,service_s);
+ free(service_s);
+ packet_send(session);
+ ssh_say(3,"Sent SSH_MSG_SERVICE_REQUEST (service %s)\n",service);
+ if(packet_wait(session,SSH2_MSG_SERVICE_ACCEPT,1)){
+ ssh_set_error(session,SSH_INVALID_DATA,"did not receive SERVICE_ACCEPT");
+ return -1;
+ }
+ ssh_say(3,"Received SSH_MSG_SERVICE_ACCEPT (service %s)\n",service);
+ return 0;
+}
+
+SSH_SESSION *ssh_connect(SSH_OPTIONS *options){
+ SSH_SESSION *session;
+ int fd;
+ if(!options){
+ ssh_set_error(NULL,SSH_FATAL,"Null argument given to ssh_connect !");
+ return NULL;
+ }
+ ssh_crypto_init();
+ if(options->fd==-1 && !options->host){
+ ssh_set_error(NULL,SSH_FATAL,"Hostname required");
+ return NULL;
+ }
+ if(options->fd != -1)
+ fd=options->fd;
+ else
+ fd=ssh_connect_host(options->host,options->bindaddr,options->port,
+ options->timeout,options->timeout_usec);
+ if(fd<0)
+ return NULL;
+ set_status(options,0.2);
+ session=ssh_session_new();
+ session->fd=fd;
+ session->alive=1;
+ session->options=options;
+ if(!(session->serverbanner=ssh_get_banner(session))){
+ ssh_cleanup(session);
+ return NULL;
+ }
+ set_status(options,0.4);
+ ssh_say(2,"banner : %s\n",session->serverbanner);
+ ssh_send_banner(session);
+ set_status(options,0.5);
+ if(ssh_get_kex(session,0)){
+ ssh_disconnect(session);
+ return NULL;
+ }
+ set_status(options,0.6);
+ list_kex(&session->server_kex);
+ if(set_kex(session)){
+ ssh_disconnect(session);
+ return NULL;
+ }
+ send_kex(session,0);
+ set_status(options,0.8);
+ if(dh_handshake(session)){
+ ssh_disconnect(session);
+ return NULL;
+ }
+ set_status(options,1.0);
+ session->connected=1;
+ return session;
+}
+
+static void ssh_cleanup(SSH_SESSION *session){
+ int i;
+ if(session->serverbanner)
+ free(session->serverbanner);
+ if(session->clientbanner)
+ free(session->clientbanner);
+ if(session->in_buffer)
+ buffer_free(session->in_buffer);
+ if(session->out_buffer)
+ buffer_free(session->out_buffer);
+ if(session->banner)
+ free(session->banner);
+ if(session->options)
+ options_free(session->options);
+ if(session->current_crypto)
+ crypto_free(session->current_crypto);
+ if(session->next_crypto)
+ crypto_free(session->next_crypto);
+
+ /* delete all channels */
+ while(session->channels)
+ channel_free(session->channels);
+ if(session->client_kex.methods)
+ for(i=0;i<10;i++)
+ if(session->client_kex.methods[i])
+ free(session->client_kex.methods[i]);
+ if(session->server_kex.methods)
+ for(i=0;i<10;++i)
+ if(session->server_kex.methods[i])
+ free(session->server_kex.methods[i]);
+ free(session->client_kex.methods);
+ free(session->server_kex.methods);
+ memset(session,'X',sizeof(SSH_SESSION)); /* burn connection, it could hangs sensitive datas */
+ free(session);
+}
+
+char *ssh_get_issue_banner(SSH_SESSION *session){
+ if(!session->banner)
+ return NULL;
+ return string_to_char(session->banner);
+}
+
+void ssh_disconnect(SSH_SESSION *session){
+ STRING *str;
+ if(session->fd!= -1) {
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_DISCONNECT);
+ buffer_add_u32(session->out_buffer,htonl(SSH2_DISCONNECT_BY_APPLICATION));
+ str=string_from_char("Bye Bye");
+ buffer_add_ssh_string(session->out_buffer,str);
+ free(str);
+ packet_send(session);
+ close(session->fd);
+ session->fd=-1;
+ }
+ session->alive=0;
+ ssh_cleanup(session);
+}
+
+const char *ssh_copyright(){
+ return LIBSSH_VERSION " (c) 2003-2004 Aris Adamantiadis (aris@0xbadc0de.be)"
+ " Distributed under the LGPL, please refer to COPYING file for informations"
+ " about your rights" ;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/connect.c b/kftpgrabber/src/misc/libs/ssh/connect.c
new file mode 100644
index 0000000..ba117f2
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/connect.c
@@ -0,0 +1,295 @@
+/* connect.c */
+/* it handles connections to ssh servers */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <netdb.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/select.h>
+#include <sys/time.h>
+#include <netinet/in.h>
+#include <fcntl.h>
+#include "priv.h"
+#ifdef HAVE_SYS_POLL_H
+#include <sys/poll.h>
+#endif
+
+#ifndef HAVE_GETHOSTBYNAME
+#ifndef HAVE_GETHOSTBYADDR
+#error "your system doesn't have gethostbyname nor gethostbyaddr"
+#endif
+#endif
+#define FIRST_CHANNEL 42
+static void sock_set_nonblocking(int sock) {
+ fcntl(sock,F_SETFL,O_NONBLOCK);
+}
+static void sock_set_blocking(int sock){
+ fcntl(sock,F_SETFL,0);
+}
+
+/* connect_host connects to an IPv4 (or IPv6) host */
+/* specified by its IP address or hostname. */
+/* output is the file descriptor, <0 if failed. */
+
+int ssh_connect_host(const char *host, const char *bind_addr, int port,long timeout, long usec){
+ struct sockaddr_in sa;
+ struct sockaddr_in bindsa;
+ struct hostent *hp=NULL;
+ static int count=0; /* for reentrencity */
+ int s;
+ while(++count>1)
+ --count;
+#ifdef HAVE_GETHOSTBYADDR
+ hp=gethostbyaddr(host,4,AF_INET);
+#endif
+#ifdef HAVE_GETHOSTBYNAME
+ if(!hp)
+ hp=gethostbyname(host);
+#endif
+ if(!hp){
+ --count;
+ ssh_set_error(NULL,SSH_FATAL,"Failed to resolve hostname %s (%s)",host,hstrerror(h_errno));
+ return -1;
+ }
+ memset(&sa,0,sizeof(sa));
+ memcpy(&sa.sin_addr,hp->h_addr,hp->h_length);
+ sa.sin_family=hp->h_addrtype;
+ sa.sin_port=htons((unsigned short)port);
+ --count;
+
+ if(bind_addr){
+ ssh_say(2,"resolving %s\n",bind_addr);
+ hp=NULL;
+ while(++count>1)
+ --count;
+#ifdef HAVE_GETHOSTBYADDR
+ hp=gethostbyaddr(bind_addr,4,AF_INET);
+#endif
+#ifdef HAVE_GETHOSTBYNAME
+ if(!hp)
+ hp=gethostbyname(bind_addr);
+#endif
+ if(!hp){
+ --count;
+ ssh_set_error(NULL,SSH_FATAL,"Failed to resolve bind address %s (%s)",bind_addr,hstrerror(h_errno));
+ return -1;
+ }
+ }
+ memset(&bindsa,0,sizeof(bindsa));
+ /* create socket */
+ s=socket(sa.sin_family,SOCK_STREAM,0);
+ if(s<0){
+ if(bind_addr)
+ --count;
+ ssh_set_error(NULL,SSH_FATAL,"socket : %s",strerror(errno));
+ return s;
+ }
+
+ if(bind_addr){
+ memcpy(&bindsa.sin_addr,hp->h_addr,hp->h_length);
+ bindsa.sin_family=hp->h_addrtype;
+ --count;
+ if(bind(s,(struct sockaddr *)&bindsa,sizeof(bindsa))<0){
+ ssh_set_error(NULL,SSH_FATAL,"Binding local address : %s",strerror(errno));
+ close(s);
+ return -1;
+ }
+ }
+ if(timeout){
+ struct timeval to;
+ fd_set set;
+ int ret=0;
+ int len=sizeof(ret);
+ to.tv_sec=timeout;
+ to.tv_usec=usec;
+ sock_set_nonblocking(s);
+ connect(s,(struct sockaddr* )&sa,sizeof(sa));
+ FD_ZERO(&set);
+ FD_SET(s,&set);
+ ret=select(s+1,NULL,&set,NULL,&to);
+ if(ret==0){
+ /* timeout */
+ ssh_set_error(NULL,SSH_FATAL,"Timeout while connecting to %s:%d",host,port);
+ close(s);
+ return -1;
+ }
+ if(ret<0){
+ ssh_set_error(NULL,SSH_FATAL,"Select error : %s",strerror(errno));
+ close(s);
+ return -1;
+ }
+ /* get connect(2) return code. zero means no error */
+ getsockopt(s,SOL_SOCKET,SO_ERROR,&ret,&len);
+ if (ret!=0){
+ ssh_set_error(NULL,SSH_FATAL,"Connecting : %s",strerror(ret));
+ close(s);
+ return -1;
+ }
+ /* s is connected ? */
+ ssh_say(3,"socket connected with timeout\n");
+ sock_set_blocking(s);
+ return s;
+ }
+ if(connect(s,(struct sockaddr *)&sa,sizeof(sa))< 0){
+ close(s);
+ ssh_set_error(NULL,SSH_FATAL,"connect: %s",strerror(errno));
+ return -1;
+ }
+ return s;
+}
+
+/* connection_new() returns a newly allocated SSH_SESSION structure pointer */
+SSH_SESSION *ssh_session_new() {
+ SSH_SESSION *conn=malloc(sizeof (SSH_SESSION));
+ memset(conn,0,sizeof(SSH_SESSION));
+ conn->next_crypto=crypto_new();
+ conn->maxchannel=FIRST_CHANNEL;
+ return conn;
+}
+
+
+/* returns 1 if bytes are available on the stream, 0 instead */
+int ssh_fd_poll(SSH_SESSION *session){
+#ifdef HAVE_POLL
+ struct pollfd fdset;
+#else
+ struct timeval sometime;
+ fd_set descriptor;
+#endif
+ if(session->datatoread)
+ return(session->datatoread);
+#ifdef HAVE_POLL
+ fdset.fd=session->fd;
+ fdset.events=POLLHUP|POLLIN|POLLPRI;
+ fdset.revents=0;
+ if(poll(&fdset,1,0)==0)
+ return 0;
+ if(fdset.revents & (POLLHUP|POLLIN|POLLPRI))
+ return (session->datatoread=1);
+ return 0;
+#elif HAVE_SELECT
+
+ /* Set to return immediately (no blocking) */
+ sometime.tv_sec = 0;
+ sometime.tv_usec = 0;
+
+ /* Set up descriptor */
+ FD_ZERO(&descriptor);
+ FD_SET(session->fd, &descriptor);
+
+ /* Make the call, and listen for errors */
+ if (select(session->fd + 1, &descriptor, NULL, NULL, &sometime) < 0) {
+ ssh_set_error(NULL,SSH_FATAL, "select: %s", strerror(errno));
+ return -1;
+ }
+ session->datatoread=FD_ISSET(session->fd,&descriptor);
+ return session->datatoread;
+#else
+#error This system does not have poll() or select(), so ssh_fd_poll() will not work correctly
+ return 0;
+#endif
+}
+
+/* this function is a complete wrapper for the select syscall. it does more than wrapping ... */
+int ssh_select(CHANNEL **channels,CHANNEL **outchannels, int maxfd, fd_set *readfds, struct timeval *timeout){
+ struct timeval zerotime;
+ fd_set localset,localset2;
+ int rep;
+ int i,j;
+ int set;
+
+ zerotime.tv_sec=0;
+ zerotime.tv_usec=0;
+ /* first, poll the maxfd file descriptors from the user with a zero-second timeout. they have the bigger priority */
+ if(maxfd>0){
+ memcpy(&localset,readfds, sizeof(fd_set));
+ rep=select(maxfd,&localset,NULL,NULL,&zerotime);
+ /* catch the eventual errors */
+ if(rep==-1)
+ return -1;
+ }
+ j=0;
+ /* polls every channel. */
+ for(i=0;channels[i];i++){
+ if(channel_poll(channels[i],0)>0){
+ outchannels[j]=channels[i];
+ j++;
+ } else
+ if(channel_poll(channels[i],1)>0){
+ outchannels[j]=channels[i];
+ j++;
+ }
+ }
+ outchannels[j]=NULL;
+ /* look into the localset for active fd */
+ set=0;
+ for(i=0;(i<maxfd) && !set;i++)
+ if(FD_ISSET(i,&localset))
+ set=1;
+ /* j!=0 means a channel has data */
+ if( (j!=0) || (set!=0)){
+ if(maxfd>0)
+ memcpy(readfds,&localset,sizeof(fd_set));
+ return 0;
+ }
+ /* at this point, not any channel had any data ready for reading, nor any fd had data for reading */
+ memcpy(&localset,readfds,sizeof(fd_set));
+ for(i=0;channels[i];i++){
+ if(channels[i]->session->alive){
+ FD_SET(channels[i]->session->fd,&localset);
+ if(channels[i]->session->fd>maxfd-1)
+ maxfd=channels[i]->session->fd+1;
+ }
+ }
+ do {
+ rep=select(maxfd,&localset,NULL,NULL,timeout);
+ } while (rep==-1 && errno==EINTR);
+ if(rep==-1){
+ /* was the error due to a libssh's Channel or from a closed descriptor from the user ? user closed descriptors have been
+ caught in the first select and not closed since that moment. that case shouldn't occur at all */
+ return -1;
+ }
+ /* set the data_to_read flag on each session */
+ for(i=0;channels[i];i++)
+ if(FD_ISSET(channels[i]->session->fd,&localset))
+ channels[i]->session->datatoread=1;
+
+ /* now, test each channel */
+ j=0;
+ for(i=0;channels[i];i++){
+ if(FD_ISSET(channels[i]->session->fd,&localset))
+ if((channel_poll(channels[i],0)>0) || (channel_poll(channels[i],1)>0)){
+ outchannels[j]=channels[i];
+ j++;
+ }
+ }
+ outchannels[j]=NULL;
+ FD_ZERO(&localset2);
+ for(i=0;i<maxfd;i++)
+ if(FD_ISSET(i,readfds) && FD_ISSET(i,&localset))
+ FD_SET(i,&localset2);
+ memcpy(readfds,&localset2,sizeof(fd_set));
+ return 0;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/crypt.c b/kftpgrabber/src/misc/libs/ssh/crypt.c
new file mode 100644
index 0000000..312c411
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/crypt.c
@@ -0,0 +1,100 @@
+/* crypt.c */
+/* it just contains the shit necessary to make blowfish-cbc work ... */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <openssl/blowfish.h>
+#include <openssl/evp.h>
+#include <openssl/hmac.h>
+
+#include <netdb.h>
+#include "priv.h"
+#include "crypto.h"
+
+u32 packet_decrypt_len(SSH_SESSION *session, char *crypted){
+ u32 *decrypted;
+ if(session->current_crypto)
+ packet_decrypt(session,crypted,session->current_crypto->in_cipher->blocksize);
+ decrypted=(u32 *)crypted;
+ ssh_say(3,"size decrypted : %lx\n",ntohl(*decrypted));
+ return ntohl(*decrypted);
+}
+
+int packet_decrypt(SSH_SESSION *session, void *data,u32 len){
+ struct crypto_struct *crypto=session->current_crypto->in_cipher;
+ char *out=malloc(len);
+ ssh_say(3,"Decrypting %d bytes data\n",len);
+ crypto->set_decrypt_key(crypto,session->current_crypto->decryptkey);
+ crypto->cbc_decrypt(crypto,data,out,len,session->current_crypto->decryptIV);
+ memcpy(data,out,len);
+ memset(out,0,len);
+ free(out);
+ return 0;
+}
+
+char * packet_encrypt(SSH_SESSION *session,void *data,u32 len){
+ struct crypto_struct *crypto;
+ HMAC_CTX *ctx;
+ char *out;
+ int finallen;
+ u32 seq=ntohl(session->send_seq);
+ if(!session->current_crypto)
+ return NULL; /* nothing to do here */
+ crypto= session->current_crypto->out_cipher;
+ ssh_say(3,"seq num = %d, len = %d\n",session->send_seq,len);
+ crypto->set_encrypt_key(crypto,session->current_crypto->encryptkey);
+ out=malloc(len);
+ ctx=hmac_init(session->current_crypto->encryptMAC,20,HMAC_SHA1);
+ hmac_update(ctx,(unsigned char *)&seq,sizeof(u32));
+ hmac_update(ctx,data,len);
+ hmac_final(ctx,session->current_crypto->hmacbuf,&finallen);
+#ifdef DEBUG_CRYPTO
+ ssh_print_hexa("mac :",data,len);
+ if(finallen!=20)
+ printf("Final len is %d\n",finallen);
+ ssh_print_hexa("packet hmac",session->current_crypto->hmacbuf,20);
+#endif
+ crypto->cbc_encrypt(crypto,data,out,len,session->current_crypto->encryptIV);
+ memcpy(data,out,len);
+ memset(out,0,len);
+ free(out);
+ return session->current_crypto->hmacbuf;
+}
+
+int packet_hmac_verify(SSH_SESSION *session,BUFFER *buffer,char *mac){
+ HMAC_CTX *ctx;
+ unsigned char hmacbuf[EVP_MAX_MD_SIZE];
+ int len;
+ u32 seq=htonl(session->recv_seq);
+ ctx=hmac_init(session->current_crypto->decryptMAC,20,HMAC_SHA1);
+ hmac_update(ctx,(unsigned char *)&seq,sizeof(u32));
+ hmac_update(ctx,buffer_get(buffer),buffer_get_len(buffer));
+ hmac_final(ctx,hmacbuf,&len);
+#ifdef DEBUG_CRYPTO
+ ssh_print_hexa("received mac",mac,len);
+ ssh_print_hexa("Computed mac",hmacbuf,len);
+ ssh_print_hexa("seq",(unsigned char *)&seq,sizeof(u32));
+#endif
+ return memcmp(mac,hmacbuf,len);
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/crypto.h b/kftpgrabber/src/misc/libs/ssh/crypto.h
new file mode 100644
index 0000000..83061e4
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/crypto.h
@@ -0,0 +1,47 @@
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+/* Crypto.h is an include file for internal structures of libssh */
+/* It hasn't to be into the final development set of files (and btw the filename would cause problems on most systems) */
+/* Openssl has (really) stupid defines */
+#ifdef set_key
+#undef set_key
+#endif
+#ifdef cbc_encrypt
+#undef cbc_encrypt
+#endif
+#ifdef cbc_decrypt
+#undef cbc_decrypt
+#endif
+#ifdef des_set_key
+#undef des_set_key
+#endif
+struct crypto_struct {
+ char *name; /* ssh name of the algorithm */
+ unsigned int blocksize; /* blocksize of the algo */
+ unsigned int keylen; /* length of the key structure */
+ void *key; /* a key buffer allocated for the algo */
+ unsigned int keysize; /* bytes of key used. != keylen */
+ void (*set_encrypt_key)(struct crypto_struct *cipher, void *key); /* sets the new key for immediate use */
+ void (*set_decrypt_key)(struct crypto_struct *cipher, void *key);
+ void (*cbc_encrypt)(struct crypto_struct *cipher, void *in, void *out,unsigned long len,void *IV);
+ void (*cbc_decrypt)(struct crypto_struct *cipher, void *in, void *out,unsigned long len,void *IV);
+};
+
diff --git a/kftpgrabber/src/misc/libs/ssh/dh.c b/kftpgrabber/src/misc/libs/ssh/dh.c
new file mode 100644
index 0000000..0a1b557
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/dh.c
@@ -0,0 +1,411 @@
+/* dh.c */
+/* this file contains usefull stuff for Diffie helman algorithm against SSH 2 */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+/* Let us resume the dh protocol. */
+/* Each side computes a private prime number, x at client side, y at server side. */
+/* g and n are two numbers common to every ssh software. */
+/* client's public key (e) is calculated by doing */
+/* e = g^x mod p */
+/* client sents e to the server . */
+/* the server computes his own public key, f */
+/* f = g^y mod p */
+/* it sents it to the client */
+/* the common key K is calculated by the client by doing */
+/* k = f^x mod p */
+/* the server does the same with the client public key e */
+/* k' = e^y mod p */
+/* if everything went correctly, k and k' are equal */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include "priv.h"
+
+#include <openssl/rand.h>
+#include <openssl/evp.h>
+#include <openssl/err.h>
+#include <string.h>
+#include "crypto.h"
+static unsigned char p_value[] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,
+ 0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,
+ 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,
+ 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,
+ 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,
+ 0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,
+ 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,
+ 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,
+ 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,
+ 0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
+#define P_LEN 128 /* Size in bytes of the p number */
+
+static unsigned long g_int = 2 ; /* G is defined as 2 by the ssh2 standards */
+static bignum g;
+static bignum p;
+
+/* maybe it might be enhanced .... */
+/* XXX Do it. */
+void ssh_get_random(void *where, int len){
+ static int rndfd=0;
+ if(!rndfd){
+ rndfd=open("/dev/urandom",O_RDONLY);
+ if(rndfd<0){
+ fprintf(stderr,"Can't open /dev/urandom\n");
+ exit(-1);
+ }
+ }
+ read(rndfd,where,len);
+}
+
+/* it inits the values g and p which are used for DH key agreement */
+void ssh_crypto_init(){
+ static int init=0;
+ if(!init){
+ g=bignum_new();
+ bignum_set_word(g,g_int);
+ p=bignum_new();
+ bignum_bin2bn(p_value,P_LEN,p);
+ init++;
+ }
+}
+
+/* prints the bignum on stderr */
+void ssh_print_bignum(char *which,bignum num){
+ char *hex;
+ fprintf(stderr,"%s value: ",which);
+ hex=bignum_bn2hex(num);
+ fprintf(stderr,"%s\n",hex);
+ free(hex);
+}
+
+void ssh_print_hexa(char *descr,unsigned char *what, int len){
+ int i;
+ printf("%s : ",descr);
+ for(i=0;i<len-1;i++)
+ printf("%.2hhx:",what[i]);
+ printf("%.2hhx\n",what[i]);
+}
+
+void dh_generate_x(SSH_SESSION *session){
+ session->next_crypto->x=bignum_new();
+ bignum_rand(session->next_crypto->x,128,0,-1);
+ /* not harder than this */
+#ifdef DEBUG_CRYPTO
+ ssh_print_bignum("x",session->next_crypto->x);
+#endif
+}
+
+void dh_generate_e(SSH_SESSION *session){
+ bignum_CTX ctx=bignum_ctx_new();
+ session->next_crypto->e=bignum_new();
+ bignum_mod_exp(session->next_crypto->e,g,session->next_crypto->x,p,ctx);
+#ifdef DEBUG_CRYPTO
+ ssh_print_bignum("e",session->next_crypto->e);
+#endif
+ bignum_ctx_free(ctx);
+}
+
+
+STRING *make_bignum_string(bignum num){
+ STRING *ptr;
+ int pad=0;
+ int len=bignum_num_bytes(num);
+ int bits=bignum_num_bits(num);
+ int finallen;
+ /* remember if the fist bit is set, it is considered as a negative number. so 0's must be appended */
+ if(!(bits%8) && bignum_is_bit_set(num,bits-1))
+ pad++;
+ ssh_say(3,"%d bits, %d bytes, %d padding\n",bits,len,pad);
+ ptr=malloc(4 + len + pad);
+ ptr->size=htonl(len+pad);
+ if(pad)
+ ptr->string[0]=0;
+ finallen=bignum_bn2bin(num,ptr->string+pad);
+ return ptr;
+}
+
+bignum make_string_bn(STRING *string){
+ int len=ntohl(string->size);
+ ssh_say(3,"Importing a %d bits,%d bytes object ...\n",len*8,len);
+ return bignum_bin2bn(string->string,len,NULL);
+}
+
+STRING *dh_get_e(SSH_SESSION *session){
+ return make_bignum_string(session->next_crypto->e);
+}
+
+void dh_import_pubkey(SSH_SESSION *session,STRING *pubkey_string){
+ session->next_crypto->server_pubkey=pubkey_string;
+}
+
+void dh_import_f(SSH_SESSION *session,STRING *f_string){
+ session->next_crypto->f=make_string_bn(f_string);
+#ifdef DEBUG_CRYPTO
+ ssh_print_bignum("f",session->next_crypto->f);
+#endif
+}
+
+void dh_build_k(SSH_SESSION *session){
+ bignum_CTX ctx=bignum_ctx_new();
+ session->next_crypto->k=bignum_new();
+ bignum_mod_exp(session->next_crypto->k,session->next_crypto->f,session->next_crypto->x,p,ctx);
+#ifdef DEBUG_CRYPTO
+ ssh_print_bignum("shared secret key",session->next_crypto->k);
+#endif
+ bignum_ctx_free(ctx);
+}
+
+static void sha_add(STRING *str,SHACTX *ctx){
+ sha1_update(ctx,str,string_len(str)+4);
+}
+
+void make_sessionid(SSH_SESSION *session){
+ SHACTX *ctx;
+ STRING *num,*str;
+ int len;
+ ctx=sha1_init();
+
+ str=string_from_char(session->clientbanner);
+ sha_add(str,ctx);
+ free(str);
+
+ str=string_from_char(session->serverbanner);
+ sha_add(str,ctx);
+ free(str);
+
+ buffer_add_u32(session->in_hashbuf,0);
+ buffer_add_u8(session->in_hashbuf,0);
+ buffer_add_u32(session->out_hashbuf,0);
+ buffer_add_u8(session->out_hashbuf,0);
+
+ len=ntohl(buffer_get_len(session->out_hashbuf));
+ sha1_update(ctx,&len,4);
+
+ sha1_update(ctx,buffer_get(session->out_hashbuf),buffer_get_len(session->out_hashbuf));
+ buffer_free(session->out_hashbuf);
+ session->out_hashbuf=NULL;
+
+ len=ntohl(buffer_get_len(session->in_hashbuf));
+ sha1_update(ctx,&len,4);
+
+ sha1_update(ctx,buffer_get(session->in_hashbuf),buffer_get_len(session->in_hashbuf));
+ buffer_free(session->in_hashbuf);
+ session->in_hashbuf=NULL;
+ sha1_update(ctx,session->next_crypto->server_pubkey,len=(string_len(session->next_crypto->server_pubkey)+4));
+ num=make_bignum_string(session->next_crypto->e);
+ sha1_update(ctx,num,len=(string_len(num)+4));
+ free(num);
+ num=make_bignum_string(session->next_crypto->f);
+ sha1_update(ctx,num,len=(string_len(num)+4));
+ free(num);
+ num=make_bignum_string(session->next_crypto->k);
+ sha1_update(ctx,num,len=(string_len(num)+4));
+ free(num);
+ sha1_final(session->next_crypto->session_id,ctx);
+
+#ifdef DEBUG_CRYPTO
+ printf("Session hash : ");
+ ssh_print_hexa("session id",session->next_crypto->session_id,SHA_DIGEST_LENGTH);
+#endif
+}
+
+void hashbufout_add_cookie(SSH_SESSION *session){
+ session->out_hashbuf=buffer_new();
+ buffer_add_u8(session->out_hashbuf,20);
+ buffer_add_data(session->out_hashbuf,session->client_kex.cookie,16);
+}
+
+
+void hashbufin_add_cookie(SSH_SESSION *session,unsigned char *cookie){
+ session->in_hashbuf=buffer_new();
+ buffer_add_u8(session->in_hashbuf,20);
+ buffer_add_data(session->in_hashbuf,cookie,16);
+}
+
+static void generate_one_key(STRING *k,char session_id[SHA_DIGEST_LENGTH],char output[SHA_DIGEST_LENGTH],char letter){
+ SHACTX *ctx=sha1_init();
+ sha1_update(ctx,k,string_len(k)+4);
+ sha1_update(ctx,session_id,SHA_DIGEST_LENGTH);
+ sha1_update(ctx,&letter,1);
+ sha1_update(ctx,session_id,SHA_DIGEST_LENGTH);
+ sha1_final(output,ctx);
+}
+
+void generate_session_keys(SSH_SESSION *session){
+ STRING *k_string;
+ SHACTX *ctx;
+ k_string=make_bignum_string(session->next_crypto->k);
+
+ /* IV */
+ generate_one_key(k_string,session->next_crypto->session_id,session->next_crypto->encryptIV,'A');
+ generate_one_key(k_string,session->next_crypto->session_id,session->next_crypto->decryptIV,'B');
+
+ generate_one_key(k_string,session->next_crypto->session_id,session->next_crypto->encryptkey,'C');
+
+ /* some ciphers need more than 20 bytes of input key */
+ if(session->next_crypto->out_cipher->keylen > SHA_DIGEST_LENGTH*8){
+ ctx=sha1_init();
+ sha1_update(ctx,k_string,string_len(k_string)+4);
+ sha1_update(ctx,session->next_crypto->session_id,SHA_DIGEST_LENGTH);
+ sha1_update(ctx,session->next_crypto->encryptkey,SHA_DIGEST_LENGTH);
+ sha1_final(session->next_crypto->encryptkey+SHA_DIGEST_LEN,ctx);
+ }
+
+ generate_one_key(k_string,session->next_crypto->session_id,session->next_crypto->decryptkey,'D');
+
+ if(session->next_crypto->in_cipher->keylen > SHA_DIGEST_LENGTH*8){
+ ctx=sha1_init();
+ sha1_update(ctx,k_string,string_len(k_string)+4);
+ sha1_update(ctx,session->next_crypto->session_id,SHA_DIGEST_LENGTH);
+ sha1_update(ctx,session->next_crypto->decryptkey,SHA_DIGEST_LENGTH);
+ sha1_final(session->next_crypto->decryptkey+SHA_DIGEST_LEN,ctx);
+ }
+
+ generate_one_key(k_string,session->next_crypto->session_id,session->next_crypto->encryptMAC,'E');
+ generate_one_key(k_string,session->next_crypto->session_id,session->next_crypto->decryptMAC,'F');
+
+#ifdef DEBUG_CRYPTO
+ ssh_print_hexa("client->server IV",session->next_crypto->encryptIV,SHA_DIGEST_LENGTH);
+ ssh_print_hexa("server->client IV",session->next_crypto->decryptIV,SHA_DIGEST_LENGTH);
+ ssh_print_hexa("encryption key",session->next_crypto->encryptkey,16);
+ ssh_print_hexa("decryption key",session->next_crypto->decryptkey,16);
+ ssh_print_hexa("Encryption MAC",session->next_crypto->encryptMAC,SHA_DIGEST_LENGTH);
+ ssh_print_hexa("Decryption MAC",session->next_crypto->decryptMAC,20);
+#endif
+ free(k_string);
+}
+
+int ssh_get_pubkey_hash(SSH_SESSION *session,char hash[MD5_DIGEST_LEN]){
+ STRING *pubkey=session->current_crypto->server_pubkey;
+ MD5CTX *ctx;
+ int len=string_len(pubkey);
+
+ ctx=md5_init();
+ md5_update(ctx,pubkey->string,len);
+ md5_final(hash,ctx);
+ return MD5_DIGEST_LEN;
+}
+
+int pubkey_get_hash(SSH_SESSION *session, char hash[MD5_DIGEST_LEN]){
+ return ssh_get_pubkey_hash(session,hash);
+}
+
+STRING *ssh_get_pubkey(SSH_SESSION *session){
+ return string_copy(session->current_crypto->server_pubkey);
+}
+
+/* XXX i doubt it is still needed, or may need some fix */
+static int match(char *group,char *object){
+ char *ptr,*saved;
+ char *end;
+ ptr=strdup(group);
+ saved=ptr;
+ while(1){
+ end=strchr(ptr,',');
+ if(end)
+ *end=0;
+ if(!strcmp(ptr,object)){
+ free(saved);
+ return 0;
+ }
+ if(end)
+ ptr=end+1;
+ else{
+ free(saved);
+ return -1;
+ }
+ }
+ /* not reached */
+ return 1;
+}
+
+int sig_verify(PUBLIC_KEY *pubkey, SIGNATURE *signature, char *digest){
+ int valid=0;
+ char hash[SHA_DIGEST_LENGTH];
+ sha1(digest,SHA_DIGEST_LENGTH,hash);
+ switch(pubkey->type){
+ case TYPE_DSS:
+ valid=DSA_do_verify(hash,SHA_DIGEST_LENGTH,signature->dsa_sign,
+ pubkey->dsa_pub);
+ if(valid==1)
+ return 0;
+ if(valid==-1){
+ ssh_set_error(NULL,SSH_INVALID_DATA,"DSA error : %s",ERR_error_string(ERR_get_error(),NULL));
+ return -1;
+ }
+ ssh_set_error(NULL,SSH_NO_ERROR,"Invalid DSA signature");
+ return -1;
+ case TYPE_RSA:
+ case TYPE_RSA1:
+ valid=RSA_verify(NID_sha1,hash,SHA_DIGEST_LENGTH,
+ signature->rsa_sign->string,string_len(signature->rsa_sign),pubkey->rsa_pub);
+ if(valid==1)
+ return 0;
+ if(valid==-1){
+ ssh_set_error(NULL,SSH_INVALID_DATA,"RSA error : %s",ERR_error_string(ERR_get_error(),NULL));
+ return -1;
+ }
+ ssh_set_error(NULL,SSH_NO_ERROR,"Invalid RSA signature");
+ return -1;
+ default:
+ ssh_set_error(NULL,SSH_INVALID_DATA,"Unknown public key type");
+ return -1;
+ }
+return -1;
+}
+
+
+int signature_verify(SSH_SESSION *session,STRING *signature){
+ PUBLIC_KEY *pubkey;
+ SIGNATURE *sign;
+ int err;
+ if(session->options->dont_verify_hostkey){
+ ssh_say(1,"Host key wasn't verified\n");
+ return 0;
+ }
+ pubkey=publickey_from_string(session->next_crypto->server_pubkey);
+ if(!pubkey)
+ return -1;
+ if(session->options->wanted_methods[KEX_HOSTKEY]){
+ if(match(session->options->wanted_methods[KEX_HOSTKEY],pubkey->type_c)){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Public key from server (%s) doesn't match user preference (%s)",
+ pubkey->type,session->options->wanted_methods[KEX_HOSTKEY]);
+ publickey_free(pubkey);
+ return -1;
+ }
+ }
+ sign=signature_from_string(signature,pubkey,pubkey->type);
+ if(!sign){
+ ssh_set_error((session->connected?session:NULL),SSH_INVALID_DATA,"Invalid signature blob");
+ publickey_free(pubkey);
+ return -1;
+ }
+ ssh_say(1,"Going to verify a %s type signature\n",pubkey->type_c);
+ err=sig_verify(pubkey,sign,session->next_crypto->session_id);
+ signature_free(sign);
+ session->next_crypto->server_pubkey_type=pubkey->type_c;
+ publickey_free(pubkey);
+ return err;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/error.c b/kftpgrabber/src/misc/libs/ssh/error.c
new file mode 100644
index 0000000..bbff5b2
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/error.c
@@ -0,0 +1,67 @@
+/* error.c */
+/* it does contain error processing functions */
+/*
+Copyright 2003,04 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "priv.h"
+
+static char error_buffer[ERROR_BUFFERLEN];
+static int error_code;
+static int verbosity;
+
+/* ssh_set_error registers an error with a description. the error code is the class of error, and description is obvious.*/
+void ssh_set_error(SSH_SESSION *session,enum ssh_error code,char *descr,...){
+ va_list va;
+ va_start(va,descr);
+ vsnprintf(session?session->error_buffer : error_buffer,ERROR_BUFFERLEN,descr,va);
+ va_end(va);
+ if(session)
+ session->error_code=code;
+ else
+ error_code=code;
+}
+
+char *ssh_get_error(SSH_SESSION *session){
+ if(session)
+ return session->error_buffer;
+ else
+ return error_buffer;
+}
+
+enum ssh_error ssh_error_code(SSH_SESSION *session){
+ if(session)
+ return session->error_code;
+ else
+ return error_code;
+}
+
+void ssh_say(int priority, char *format,...){
+ va_list va;
+ va_start(va,format);
+ if(priority <= verbosity)
+ vfprintf(stderr,format,va);
+ va_end(va);
+}
+
+void ssh_set_verbosity(int num){
+ verbosity=num;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/gzip.c b/kftpgrabber/src/misc/libs/ssh/gzip.c
new file mode 100644
index 0000000..1003b50
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/gzip.c
@@ -0,0 +1,140 @@
+/* gzip.c */
+/* include hooks for compression of packets */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+#include "priv.h"
+#ifdef HAVE_LIBZ
+#undef NO_GZIP
+#else
+#define NO_GZIP
+#endif
+
+#ifndef NO_GZIP
+#include <zlib.h>
+#include <string.h>
+#define BLOCKSIZE 4092
+
+static z_stream *initcompress(SSH_SESSION *session,int level){
+ z_stream *stream=malloc(sizeof(z_stream));
+ int status;
+ memset(stream,0,sizeof(z_stream));
+ status=deflateInit(stream,level);
+ if (status!=0)
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"status %d inititalising zlib deflate",status);
+ return stream;
+}
+
+BUFFER *gzip_compress(SSH_SESSION *session,BUFFER *source,int level){
+ BUFFER *dest;
+ static unsigned char out_buf[BLOCKSIZE];
+ void *in_ptr=buffer_get(source);
+ unsigned long in_size=buffer_get_len(source);
+ unsigned long len;
+ int status;
+ z_stream *zout=session->current_crypto->compress_out_ctx;
+ if(!zout)
+ zout=session->current_crypto->compress_out_ctx=initcompress(session,level);
+ dest=buffer_new();
+ zout->next_out=out_buf;
+ zout->next_in=in_ptr;
+ zout->avail_in=in_size;
+ do {
+ zout->avail_out=BLOCKSIZE;
+ status=deflate(zout,Z_PARTIAL_FLUSH);
+ if(status !=0){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"status %d deflating zlib packet",status);
+ return NULL;
+ }
+ len=BLOCKSIZE-zout->avail_out;
+ buffer_add_data(dest,out_buf,len);
+ zout->next_out=out_buf;
+ } while (zout->avail_out == 0);
+
+ return dest;
+}
+
+int compress_buffer(SSH_SESSION *session,BUFFER *buf){
+ BUFFER *dest=gzip_compress(session,buf,9);
+ if(!dest)
+ return -1;
+ buffer_reinit(buf);
+ buffer_add_data(buf,buffer_get(dest),buffer_get_len(dest));
+ buffer_free(dest);
+ return 0;
+}
+
+/* decompression */
+
+static z_stream *initdecompress(SSH_SESSION *session){
+ z_stream *stream=malloc(sizeof(z_stream));
+ int status;
+ memset(stream,0,sizeof(z_stream));
+ status=inflateInit(stream);
+ if (status!=0){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Status = %d initiating inflate context !",status);
+ free(stream);
+ stream=NULL;
+ }
+ return stream;
+}
+
+BUFFER *gzip_decompress(SSH_SESSION *session,BUFFER *source){
+ BUFFER *dest;
+ static unsigned char out_buf[BLOCKSIZE];
+ void *in_ptr=buffer_get_rest(source);
+ unsigned long in_size=buffer_get_rest_len(source);
+ unsigned long len;
+ int status;
+ z_stream *zin=session->current_crypto->compress_in_ctx;
+ if(!zin)
+ zin=session->current_crypto->compress_in_ctx=initdecompress(session);
+ dest=buffer_new();
+ zin->next_out=out_buf;
+ zin->next_in=in_ptr;
+ zin->avail_in=in_size;
+ do {
+ zin->avail_out=BLOCKSIZE;
+ status=inflate(zin,Z_PARTIAL_FLUSH);
+ if(status !=Z_OK){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"status %d inflating zlib packet",status);
+ buffer_free(dest);
+ return NULL;
+ }
+ len=BLOCKSIZE-zin->avail_out;
+ buffer_add_data(dest,out_buf,len);
+ zin->next_out=out_buf;
+ } while (zin->avail_out == 0);
+
+ return dest;
+}
+
+int decompress_buffer(SSH_SESSION *session,BUFFER *buf){
+ BUFFER *dest=gzip_decompress(session,buf);
+ buffer_reinit(buf);
+ if(!dest){
+ return -1; /* failed */
+ }
+ buffer_reinit(buf);
+ buffer_add_data(buf,buffer_get(dest),buffer_get_len(dest));
+ buffer_free(dest);
+ return 0;
+}
+
+#endif /* NO_GZIP */
diff --git a/kftpgrabber/src/misc/libs/ssh/kex.c b/kftpgrabber/src/misc/libs/ssh/kex.c
new file mode 100644
index 0000000..ae2c871
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/kex.c
@@ -0,0 +1,264 @@
+/* kex.c is used well, in key exchange :-) */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <string.h>
+#include <stdlib.h>
+#include "priv.h"
+#include "ssh2.h"
+#ifdef HAVE_OPENSSL_BLOWFISH_H
+#define BLOWFISH "blowfish-cbc"
+#else
+#define BLOWFISH ""
+#endif
+#ifdef HAVE_OPENSSL_AES_H
+#define AES "aes256-cbc,aes192-cbc,aes128-cbc,"
+#else
+#define AES ""
+#endif
+#ifdef HAVE_LIBZ
+#define ZLIB "none,zlib"
+#else
+#define ZLIB "none"
+#endif
+char *default_methods[]={
+ "diffie-hellman-group1-sha1","ssh-dss,ssh-rsa",AES BLOWFISH, AES BLOWFISH,
+ "hmac-sha1","hmac-sha1","none","none","","",NULL };
+char *supported_methods[]={
+ "diffie-hellman-group1-sha1","ssh-dss,ssh-rsa",AES BLOWFISH,AES BLOWFISH,
+ "hmac-sha1","hmac-sha1",ZLIB,ZLIB,"","",NULL };
+/* descriptions of the key exchange packet */
+char *ssh_kex_nums[]={
+ "kex algos","server host key algo","encryption client->server","encryption server->client",
+ "mac algo client->server","mac algo server->client","compression algo client->server",
+ "compression algo server->client","languages client->server","languages server->client",NULL};
+
+/* tokenize will return a token of strings delimited by ",". the first element has to be freed */
+static char **tokenize(char *chain){
+ char **tokens;
+ int n=1;
+ int i=0;
+ char *ptr=chain=strdup(chain);
+ while(*ptr){
+ if(*ptr==','){
+ n++;
+ *ptr=0;
+ }
+ ptr++;
+ }
+ /* now n contains the number of tokens, the first possibly empty if the list was empty too e.g. "" */
+ tokens=malloc(sizeof(char *) * (n+1) ); /* +1 for the null */
+ ptr=chain;
+ for(i=0;i<n;i++){
+ tokens[i]=ptr;
+ while(*ptr)
+ ptr++; /* find a zero */
+ ptr++; /* then go one step further */
+ }
+ tokens[i]=NULL;
+ return tokens;
+}
+
+/* same as tokenize(), but with spaces instead of ',' */
+char **space_tokenize(char *chain){
+ char **tokens;
+ int n=1;
+ int i=0;
+ char *ptr=chain=strdup(chain);
+ while(*ptr==' ')
+ ++ptr; /* skip initial spaces */
+ while(*ptr){
+ if(*ptr==' '){
+ n++; /* count one token per word */
+ *ptr=0;
+ while(*(ptr+1)==' '){ /* don't count if the tokens have more than 2 spaces */
+ *(ptr++)=0;
+ }
+ }
+ ptr++;
+ }
+ /* now n contains the number of tokens, the first possibly empty if the list was empty too e.g. "" */
+ tokens=malloc(sizeof(char *) * (n+1) ); /* +1 for the null */
+ ptr=chain; /* we don't pass the initial spaces because the "chain" pointer is needed by the caller */
+ /* function to free the tokens. */
+ for(i=0;i<n;i++){
+ tokens[i]=ptr;
+ if(i!=n-1){
+ while(*ptr)
+ ptr++; /* find a zero */
+ while(!*(ptr+1))
+ ++ptr; /* if the zero is followed by other zeros, go through them */
+ ptr++; /* then go one step further */
+ }
+ }
+ tokens[i]=NULL;
+ return tokens;
+}
+
+/* find_matching gets 2 parameters : a list of available objects (in_d), separated by colons,*/
+/* and a list of prefered objects (what_d) */
+/* it will return a strduped pointer on the first prefered object found in the available objects list */
+
+static char *find_matching(char *in_d, char *what_d){
+ char ** tok_in, **tok_what;
+ int i_in, i_what;
+ char *ret;
+
+ if( ! (in_d && what_d))
+ return NULL; /* don't deal with null args */
+ ssh_say(3,"find_matching(\"%s\",\"%s\") = ",in_d,what_d);
+ tok_in=tokenize(in_d);
+ tok_what=tokenize(what_d);
+ for(i_in=0; tok_in[i_in]; ++i_in){
+ for(i_what=0; tok_what[i_what] ; ++i_what){
+ if(!strcmp(tok_in[i_in],tok_what[i_what])){
+ /* match */
+ ssh_say(3,"\"%s\"\n",tok_in[i_in]);
+ ret=strdup(tok_in[i_in]);
+ /* free the tokens */
+ free(tok_in[0]);
+ free(tok_what[0]);
+ free(tok_in);
+ free(tok_what);
+ return ret;
+ }
+ }
+ }
+ ssh_say(3,"NULL\n");
+ free(tok_in[0]);
+ free(tok_what[0]);
+ free(tok_in);
+ free(tok_what);
+ return NULL;
+}
+
+int ssh_get_kex(SSH_SESSION *session,int server_kex ){
+ STRING *str;
+ char *strings[10];
+ int i;
+ if(packet_wait(session,SSH2_MSG_KEXINIT,1))
+ return -1;
+ if(buffer_get_data(session->in_buffer,session->server_kex.cookie,16)!=16){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"get_kex(): no cookie in packet");
+ return -1;
+ }
+ hashbufin_add_cookie(session,session->server_kex.cookie);
+ memset(strings,0,sizeof(char *)*10);
+ for(i=0;i<10;++i){
+ str=buffer_get_ssh_string(session->in_buffer);
+ if(!str)
+ break;
+ if(str){
+ buffer_add_ssh_string(session->in_hashbuf,str);
+ strings[i]=string_to_char(str);
+ free(str);
+ } else
+ strings[i]=NULL;
+ }
+ /* copy the server kex info into an array of strings */
+ if(server_kex){
+ session->client_kex.methods=malloc( 10 * sizeof(char **));
+ for(i=0;i<10;++i)
+ session->client_kex.methods[i]=strings[i];
+ } else { /* client */
+ session->server_kex.methods=malloc( 10 * sizeof(char **));
+ for(i=0;i<10;++i)
+ session->server_kex.methods[i]=strings[i];
+ }
+ return 0;
+}
+
+void list_kex(KEX *kex){
+ int i=0;
+#ifdef DEBUG_CRYPTO
+ ssh_print_hexa("session cookie",kex->cookie,16);
+#endif
+ for(i=0;i<10;i++){
+ ssh_say(2,"%s : %s\n",ssh_kex_nums[i],kex->methods[i]);
+ }
+}
+
+/* set_kex basicaly look at the option structure of the session and set the output kex message */
+/* it must be aware of the server kex message */
+/* it can fail if option is null, not any user specified kex method matches the server one, if not any default kex matches */
+
+int set_kex(SSH_SESSION *session){
+ KEX *server = &session->server_kex;
+ KEX *client=&session->client_kex;
+ SSH_OPTIONS *options=session->options;
+ int i;
+ char *wanted;
+ /* the client might ask for a specific cookie to be sent. useful for server debugging */
+ if(options->wanted_cookie)
+ memcpy(client->cookie,options->wanted_cookie,16);
+ else
+ ssh_get_random(client->cookie,16);
+ client->methods=malloc(10 * sizeof(char **));
+ memset(client->methods,0,10*sizeof(char **));
+ for (i=0;i<10;i++){
+ if(!(wanted=options->wanted_methods[i]))
+ wanted=default_methods[i];
+ client->methods[i]=find_matching(server->methods[i],wanted);
+ if(!client->methods[i] && i < KEX_LANG_C_S){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"kex error : did not find one of algos %s in list %s for %s",
+ wanted,server->methods[i],ssh_kex_nums[i]);
+ return -1;
+ } else {
+ if(i>=KEX_LANG_C_S && !client->methods[i])
+ client->methods[i]=strdup(""); /* we can safely do that for languages */
+ }
+ }
+ return 0;
+}
+
+/* this function only sends the predefined set of kex methods */
+void send_kex(SSH_SESSION *session, int server_kex){
+ STRING *str;
+ int i=0;
+ KEX *kex=(server_kex ? &session->server_kex : &session->client_kex);
+ packet_clear_out(session);
+ buffer_add_u8(session->out_buffer,SSH2_MSG_KEXINIT);
+ buffer_add_data(session->out_buffer,kex->cookie,16);
+ hashbufout_add_cookie(session);
+ list_kex(kex);
+ for(i=0;i<10;i++){
+ str=string_from_char(kex->methods[i]);
+ buffer_add_ssh_string(session->out_hashbuf,str);
+ buffer_add_ssh_string(session->out_buffer,str);
+ free(str);
+ }
+ i=0;
+ buffer_add_u8(session->out_buffer,0);
+ buffer_add_u32(session->out_buffer,0);
+ packet_send(session);
+}
+
+/* returns 1 if at least one of the name algos is in the default algorithms table */
+int verify_existing_algo(int algo, char *name){
+ char *ptr;
+ if(algo>9 || algo <0)
+ return -1;
+ ptr=find_matching(supported_methods[algo],name);
+ if(ptr){
+ free(ptr);
+ return 1;
+ }
+ return 0;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/keyfiles.c b/kftpgrabber/src/misc/libs/ssh/keyfiles.c
new file mode 100644
index 0000000..660155e
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/keyfiles.c
@@ -0,0 +1,341 @@
+/* keyfiles.c */
+/* This part of the library handles private and public key files needed for publickey authentication,*/
+/* as well as servers public hashes verifications and certifications. Lot of code here handles openssh */
+/* implementations (key files aren't standardized yet). */
+
+/*
+Copyright 2003,04 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <openssl/pem.h>
+#include <openssl/dsa.h>
+#include <openssl/err.h>
+#include <openssl/rsa.h>
+#include "priv.h"
+#define MAXLINESIZE 80
+
+static int default_get_password(char *buf, int size,int rwflag, char *descr){
+ char *pass;
+ char buffer[256];
+ int len;
+ snprintf(buffer,256,"Please enter passphrase for %s",descr);
+ pass=getpass(buffer);
+ snprintf(buf,size,"%s",buffer);
+ len=strlen(buf);
+ memset(pass,0,strlen(pass));
+ return len;
+}
+
+/* in case the passphrase has been given in parameter */
+static int get_password_specified(char *buf,int size, int rwflag, char *password){
+ snprintf(buf,size,"%s",password);
+ return strlen(buf);
+}
+
+/* TODO : implement it to read both DSA and RSA at once */
+PRIVATE_KEY *privatekey_from_file(SSH_SESSION *session,char *filename,int type,char *passphrase){
+ FILE *file=fopen(filename,"r");
+ PRIVATE_KEY *privkey;
+ DSA *dsa=NULL;
+ RSA *rsa=NULL;
+
+ if (!file) {
+ ssh_set_error(session,SSH_REQUEST_DENIED,"Error opening %s : %s",filename,strerror(errno));
+ return NULL;
+ }
+
+ if (!passphrase) {
+ return NULL;
+ }
+
+ /* Add all encryption algorythms to OpenSSL or this will fail */
+ OpenSSL_add_all_algorithms();
+
+ if (type == TYPE_DSS) {
+ dsa = PEM_read_DSAPrivateKey(file,NULL,(void *)get_password_specified,passphrase);
+
+ fclose(file);
+ if(!dsa) {
+ ssh_set_error(session,SSH_FATAL,"parsing private key %s : %s",filename,ERR_error_string(ERR_get_error(),NULL));
+ return NULL;
+ }
+ } else if (type == TYPE_RSA) {
+ rsa=PEM_read_RSAPrivateKey(file,NULL,(void *)get_password_specified,passphrase);
+
+ fclose(file);
+ if(!rsa){
+ ssh_set_error(session,SSH_FATAL,"parsing private key %s : %s",filename,ERR_error_string(ERR_get_error(),NULL));
+ return NULL;
+ }
+ } else {
+ ssh_set_error(session,SSH_FATAL,"Invalid private key type %d",type);
+ return NULL;
+ }
+
+ privkey = malloc(sizeof(PRIVATE_KEY));
+ privkey->type = type;
+ privkey->dsa_priv = dsa;
+ privkey->rsa_priv = rsa;
+
+ return privkey;
+}
+
+void private_key_free(PRIVATE_KEY *prv){
+ if(prv->dsa_priv)
+ DSA_free(prv->dsa_priv);
+ if(prv->rsa_priv)
+ RSA_free(prv->rsa_priv);
+ memset(prv,0,sizeof(PRIVATE_KEY));
+ free(prv);
+}
+
+STRING *publickey_from_file(char *filename,int *_type){
+ BUFFER *buffer;
+ int type;
+ STRING *str;
+ char buf[4096]; /* noone will have bigger keys that that */
+ /* where have i head that again ? */
+ int fd=open(filename,O_RDONLY);
+ int r;
+ char *ptr;
+ if(fd<0){
+ ssh_set_error(NULL,SSH_INVALID_REQUEST,"nonexistent public key file");
+ return NULL;
+ }
+ if(read(fd,buf,8)!=8){
+ close(fd);
+ ssh_set_error(NULL,SSH_INVALID_REQUEST,"Invalid public key file");
+ return NULL;
+ }
+ buf[7]=0;
+ if(!strcmp(buf,"ssh-dss"))
+ type=TYPE_DSS;
+ else if (!strcmp(buf,"ssh-rsa"))
+ type=TYPE_RSA;
+ else {
+ close(fd);
+ ssh_set_error(NULL,SSH_INVALID_REQUEST,"Invalid public key file");
+ return NULL;
+ }
+ r=read(fd,buf,sizeof(buf)-1);
+ close(fd);
+ if(r<=0){
+ ssh_set_error(NULL,SSH_INVALID_REQUEST,"Invalid public key file");
+ return NULL;
+ }
+ buf[r]=0;
+ ptr=strchr(buf,' ');
+ if(ptr)
+ *ptr=0; /* eliminates the garbage at end of file */
+ buffer=base64_to_bin(buf);
+ if(buffer){
+ str=string_new(buffer_get_len(buffer));
+ string_fill(str,buffer_get(buffer),buffer_get_len(buffer));
+ buffer_free(buffer);
+ if(_type)
+ *_type=type;
+ return str;
+ } else {
+ ssh_set_error(NULL,SSH_INVALID_REQUEST,"Invalid public key file");
+ return NULL; /* invalid file */
+ }
+}
+
+
+/* why recursing ? i'll explain. on top, publickey_from_next_file will be executed until NULL returned */
+/* we can't return null if one of the possible keys is wrong. we must test them before getting over */
+STRING *publickey_from_next_file(SSH_SESSION *session,char **pub_keys_path,char **keys_path,
+ char **privkeyfile,int *type,int *count){
+ static char *home=NULL;
+ char public[256];
+ char private[256];
+ char *priv;
+ char *pub;
+ STRING *pubkey;
+ if(!home)
+ home=ssh_get_user_home_dir();
+ if(home==NULL) {
+ ssh_set_error(session,SSH_FATAL,"User home dir impossible to guess");
+ return NULL;
+ }
+ ssh_set_error(session,SSH_NO_ERROR,"no public key matched");
+ if((pub=pub_keys_path[*count])==NULL)
+ return NULL;
+ if((priv=keys_path[*count])==NULL)
+ return NULL;
+ ++*count;
+ /* are them readable ? */
+ snprintf(public,256,pub,home);
+ ssh_say(2,"Trying to open %s\n",public);
+ if(!ssh_file_readaccess_ok(public)){
+ ssh_say(2,"Failed\n");
+ return publickey_from_next_file(session,pub_keys_path,keys_path,privkeyfile,type,count);
+ }
+ snprintf(private,256,priv,home);
+ ssh_say(2,"Trying to open %s\n",private);
+ if(!ssh_file_readaccess_ok(private)){
+ ssh_say(2,"Failed\n");
+ return publickey_from_next_file(session,pub_keys_path,keys_path,privkeyfile,type,count);
+ }
+ ssh_say(2,"Okay both files ok\n");
+ /* ok, we are sure both the priv8 and public key files are readable : we return the public one as a string,
+ and the private filename in arguments */
+ pubkey=publickey_from_file(public,type);
+ if(!pubkey){
+ ssh_say(2,"Wasn't able to open public key file %s : %s\n",public,ssh_get_error(session));
+ return publickey_from_next_file(session,pub_keys_path,keys_path,privkeyfile,type,count);
+ }
+ *privkeyfile=realloc(*privkeyfile,strlen(private)+1);
+ strcpy(*privkeyfile,private);
+ return pubkey;
+}
+
+#define FOUND_OTHER ( (void *)-1)
+#define FILE_NOT_FOUND ((void *)-2)
+/* will return a token array containing [host,]ip keytype key */
+/* NULL if no match was found, FOUND_OTHER if the match is on an other */
+/* type of key (ie dsa if type was rsa) */
+static char **ssh_parse_knownhost(char *filename, char *hostname, char *type){
+ FILE *file=fopen(filename,"r");
+ char buffer[4096];
+ char *ptr;
+ char **tokens;
+ char **ret=NULL;
+ if(!file)
+ return FILE_NOT_FOUND;
+ while(fgets(buffer,sizeof(buffer),file)){
+ ptr=strchr(buffer,'\n');
+ if(ptr) *ptr=0;
+ if((ptr=strchr(buffer,'\r'))) *ptr=0;
+ if(!buffer[0])
+ continue; /* skip empty lines */
+ tokens=space_tokenize(buffer);
+ if(!tokens[0] || !tokens[1] || !tokens[2]){
+ /* it should have exactly 3 tokens */
+ free(tokens[0]);
+ free(tokens);
+ continue;
+ }
+ if(tokens[3]){
+ /* 3 tokens only, not four */
+ free(tokens[0]);
+ free(tokens);
+ continue;
+ }
+ ptr=tokens[0];
+ while(*ptr==' ')
+ ptr++; /* skip the initial spaces */
+ /* we allow spaces or ',' to follow the hostname. It's generaly an IP */
+ /* we don't care about ip, if the host key match there is no problem with ip */
+ if(strncasecmp(ptr,hostname,strlen(hostname))==0){
+ if(ptr[strlen(hostname)]==' ' || ptr[strlen(hostname)]=='\0'
+ || ptr[strlen(hostname)]==','){
+ if(strcasecmp(tokens[1],type)==0){
+ fclose(file);
+ return tokens;
+ } else {
+ ret=FOUND_OTHER;
+ }
+ }
+ }
+ /* not the good one */
+ free(tokens[0]);
+ free(tokens);
+ }
+ fclose(file);
+ /* we did not find */
+ return ret;
+}
+
+/* public function to test if the server is known or not */
+int ssh_is_server_known(SSH_SESSION *session){
+ char *pubkey_64;
+ BUFFER *pubkey_buffer;
+ STRING *pubkey=session->current_crypto->server_pubkey;
+ char **tokens;
+ options_default_known_hosts_file(session->options);
+ if(!session->options->host){
+ ssh_set_error(session,SSH_FATAL,"Can't verify host in known hosts if the hostname isn't known");
+ return SSH_SERVER_ERROR;
+ }
+ tokens=ssh_parse_knownhost(session->options->known_hosts_file,
+ session->options->host,session->current_crypto->server_pubkey_type);
+ if(tokens==NULL)
+ return SSH_SERVER_NOT_KNOWN;
+ if(tokens==FOUND_OTHER)
+ return SSH_SERVER_FOUND_OTHER;
+ if(tokens==FILE_NOT_FOUND){
+ ssh_set_error(session,SSH_FATAL,"verifying that server is a known host : file %s not found",session->options->known_hosts_file);
+ return SSH_SERVER_ERROR;
+ }
+ /* ok we found some public key in known hosts file. now un-base64it */
+ /* Some time, we may verify the IP address did not change. I honestly think */
+ /* it's not an important matter as IP address are known not to be secure */
+ /* and the crypto stuff is enough to prove the server's identity */
+ pubkey_64=tokens[2];
+ pubkey_buffer=base64_to_bin(pubkey_64);
+ /* at this point, we may free the tokens */
+ free(tokens[0]);
+ free(tokens);
+ if(!pubkey_buffer){
+ ssh_set_error(session,SSH_FATAL,"verifying that server is a known host : base 64 error");
+ return SSH_SERVER_ERROR;
+ }
+ if(buffer_get_len(pubkey_buffer)!=string_len(pubkey)){
+ buffer_free(pubkey_buffer);
+ return SSH_SERVER_KNOWN_CHANGED;
+ }
+ /* now test that they are identical */
+ if(memcmp(buffer_get(pubkey_buffer),pubkey->string,buffer_get_len(pubkey_buffer))!=0){
+ buffer_free(pubkey_buffer);
+ return SSH_SERVER_KNOWN_CHANGED;
+ }
+ buffer_free(pubkey_buffer);
+ return SSH_SERVER_KNOWN_OK;
+}
+
+int ssh_write_knownhost(SSH_SESSION *session){
+ char *pubkey_64;
+ STRING *pubkey=session->current_crypto->server_pubkey;
+ char buffer[4096];
+ FILE *file;
+ options_default_known_hosts_file(session->options);
+ if(!session->options->host){
+ ssh_set_error(session,SSH_FATAL,"Cannot write host in known hosts if the hostname is unknown");
+ return -1;
+ }
+ /* a = append only */
+ file=fopen(session->options->known_hosts_file,"a");
+ if(!file){
+ ssh_set_error(session,SSH_FATAL,"Opening known host file %s for appending : %s",
+ session->options->known_hosts_file,strerror(errno));
+ return -1;
+ }
+ pubkey_64=bin_to_base64(pubkey->string,string_len(pubkey));
+ snprintf(buffer,sizeof(buffer),"%s %s %s\n",session->options->host,session->current_crypto->server_pubkey_type,pubkey_64);
+ free(pubkey_64);
+ fwrite(buffer,strlen(buffer),1,file);
+ fclose(file);
+ return 0;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/keys.c b/kftpgrabber/src/misc/libs/ssh/keys.c
new file mode 100644
index 0000000..f404f4b
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/keys.c
@@ -0,0 +1,353 @@
+/* keys handle the public key related functions */
+/* decoding a public key (both rsa and dsa), decoding a signature (rsa and dsa), veryfying them */
+
+/*
+Copyright 2003,04 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+#include <string.h>
+#include <openssl/dsa.h>
+#include <openssl/rsa.h>
+#include "priv.h"
+
+
+/* Public key decoding functions */
+
+char *ssh_type_to_char(int type){
+ switch(type){
+ case TYPE_DSS:
+ return "ssh-dss";
+ case TYPE_RSA:
+ case TYPE_RSA1:
+ return "ssh-rsa";
+ default:
+ return NULL;
+ }
+}
+
+PUBLIC_KEY *publickey_make_dss(BUFFER *buffer){
+ STRING *p,*q,*g,*pubkey;
+ PUBLIC_KEY *key=malloc(sizeof(PUBLIC_KEY));
+ key->type=TYPE_DSS;
+ key->type_c="ssh-dss";
+ p=buffer_get_ssh_string(buffer);
+ q=buffer_get_ssh_string(buffer);
+ g=buffer_get_ssh_string(buffer);
+ pubkey=buffer_get_ssh_string(buffer);
+ buffer_free(buffer); /* we don't need it anymore */
+ if(!p || !q || !g || !pubkey){
+ ssh_set_error(NULL,SSH_FATAL,"Invalid DSA public key");
+ if(p)
+ free(p);
+ if(q)
+ free(q);
+ if(g)
+ free(g);
+ if(pubkey)
+ free(pubkey);
+ free(key);
+ return NULL;
+ }
+ key->dsa_pub=DSA_new();
+ key->dsa_pub->p=make_string_bn(p);
+ key->dsa_pub->q=make_string_bn(q);
+ key->dsa_pub->g=make_string_bn(g);
+ key->dsa_pub->pub_key=make_string_bn(pubkey);
+ free(p);
+ free(q);
+ free(g);
+ free(pubkey);
+ return key;
+}
+
+PUBLIC_KEY *publickey_make_rsa(BUFFER *buffer){
+ STRING *e,*n;
+ PUBLIC_KEY *key=malloc(sizeof(PUBLIC_KEY));
+ key->type=TYPE_RSA;
+ key->type_c="ssh-rsa";
+ e=buffer_get_ssh_string(buffer);
+ n=buffer_get_ssh_string(buffer);
+ buffer_free(buffer); /* we don't need it anymore */
+ if(!e || !n){
+ ssh_set_error(NULL,SSH_FATAL,"Invalid RSA public key");
+ if(e)
+ free(e);
+ if(n)
+ free(n);
+ free(key);
+ return NULL;
+ }
+ key->rsa_pub=RSA_new();
+ key->rsa_pub->e=make_string_bn(e);
+ key->rsa_pub->n=make_string_bn(n);
+#ifdef DEBUG_CRYPTO
+ ssh_print_bignum("e",key->rsa_pub->e);
+ ssh_print_bignum("n",key->rsa_pub->n);
+#endif
+ free(e);
+ free(n);
+ return key;
+}
+
+void publickey_free(PUBLIC_KEY *key){
+ if(!key)
+ return;
+ switch(key->type){
+ case TYPE_DSS:
+ DSA_free(key->dsa_pub);
+ break;
+ case TYPE_RSA:
+ case TYPE_RSA1:
+ RSA_free(key->rsa_pub);
+ break;
+ default:
+ break;
+ }
+ free(key);
+}
+
+PUBLIC_KEY *publickey_from_string(STRING *pubkey_s){
+ BUFFER *tmpbuf=buffer_new();
+ STRING *type_s;
+ char *type;
+
+ buffer_add_data(tmpbuf,pubkey_s->string,string_len(pubkey_s));
+ type_s=buffer_get_ssh_string(tmpbuf);
+ if(!type_s){
+ buffer_free(tmpbuf);
+ ssh_set_error(NULL,SSH_FATAL,"Invalid public key format");
+ return NULL;
+ }
+ type=string_to_char(type_s);
+ free(type_s);
+ if(!strcmp(type,"ssh-dss")){
+ free(type);
+ return publickey_make_dss(tmpbuf);
+ }
+ if(!strcmp(type,"ssh-rsa")){
+ free(type);
+ return publickey_make_rsa(tmpbuf);
+ }
+ ssh_set_error(NULL,SSH_FATAL,"unknown public key protocol %s",type);
+ buffer_free(tmpbuf);
+ free(type);
+ return NULL;
+}
+
+/* Signature decoding functions */
+
+STRING *signature_to_string(SIGNATURE *sign){
+ STRING *str;
+ STRING *rs,*r,*s;
+ unsigned char buffer[40];
+ BUFFER *tmpbuf=buffer_new();
+ STRING *tmp;
+ tmp=string_from_char(ssh_type_to_char(sign->type));
+ buffer_add_ssh_string(tmpbuf,tmp);
+ free(tmp);
+ switch(sign->type){
+ case TYPE_DSS:
+ r=make_bignum_string(sign->dsa_sign->r);
+ s=make_bignum_string(sign->dsa_sign->s);
+ rs=string_new(40);
+ memset(buffer,0,40);
+ memcpy(buffer,r->string+string_len(r)-20,20);
+ memcpy(buffer+ 20, s->string + string_len(s) - 20, 20);
+ string_fill(rs,buffer,40);
+ free(r);
+ free(s);
+ buffer_add_ssh_string(tmpbuf,rs);
+ free(rs);
+ break;
+ case TYPE_RSA:
+ case TYPE_RSA1:
+ buffer_add_ssh_string(tmpbuf,sign->rsa_sign);
+ break;
+ }
+ str=string_new(buffer_get_len(tmpbuf));
+ string_fill(str,buffer_get(tmpbuf),buffer_get_len(tmpbuf));
+ buffer_free(tmpbuf);
+ return str;
+}
+
+/* TODO : split this function in two so it becomes smaller */
+SIGNATURE *signature_from_string(STRING *signature,PUBLIC_KEY *pubkey,int needed_type){
+ DSA_SIG *sig;
+ SIGNATURE *sign=malloc(sizeof(SIGNATURE));
+ BUFFER *tmpbuf=buffer_new();
+ STRING *rs;
+ STRING *r,*s,*type_s,*e;
+ int len,rsalen;
+ char *type;
+ buffer_add_data(tmpbuf,signature->string,string_len(signature));
+ type_s=buffer_get_ssh_string(tmpbuf);
+ if(!type_s){
+ ssh_set_error(NULL,SSH_FATAL,"Invalid signature packet");
+ buffer_free(tmpbuf);
+ return NULL;
+ }
+ type=string_to_char(type_s);
+ free(type_s);
+ switch(needed_type){
+ case TYPE_DSS:
+ if(strcmp(type,"ssh-dss")){
+ ssh_set_error(NULL,SSH_FATAL,"Invalid signature type : %s",type);
+ buffer_free(tmpbuf);
+ free(type);
+ return NULL;
+ }
+ break;
+ case TYPE_RSA:
+ if(strcmp(type,"ssh-rsa")){
+ ssh_set_error(NULL,SSH_FATAL,"Invalid signature type : %s",type);
+ buffer_free(tmpbuf);
+ free(type);
+ return NULL;
+ }
+ break;
+ default:
+ ssh_set_error(NULL,SSH_FATAL,"Invalid signature type : %s",type);
+ free(type);
+ buffer_free(tmpbuf);
+ return NULL;
+ }
+ free(type);
+ switch(needed_type){
+ case TYPE_DSS:
+ rs=buffer_get_ssh_string(tmpbuf);
+ buffer_free(tmpbuf);
+ if(!rs || string_len(rs)!=40){ /* 40 is the dual signature blob len. */
+ if(rs)
+ free(rs);
+ return NULL;
+ }
+ /* we make use of strings because we have all-made functions to convert them to bignums */
+ r=string_new(20);
+ s=string_new(20);
+ string_fill(r,rs->string,20);
+ string_fill(s,rs->string+20,20);
+ free(rs);
+ sig=DSA_SIG_new();
+ sig->r=make_string_bn(r); /* is that really portable ? Openssh's hack isn't better */
+ sig->s=make_string_bn(s);
+#ifdef DEBUG_CRYPTO
+ ssh_print_bignum("r",sig->r);
+ ssh_print_bignum("s",sig->s);
+#endif
+ free(r);
+ free(s);
+ sign->type=TYPE_DSS;
+ sign->dsa_sign=sig;
+ return sign;
+ case TYPE_RSA:
+ e=buffer_get_ssh_string(tmpbuf);
+ buffer_free(tmpbuf);
+ if(!e){
+ free(e);
+ return NULL;
+ }
+ len=string_len(e);
+ rsalen=RSA_size(pubkey->rsa_pub);
+ if(len>rsalen){
+ free(e);
+ free(sign);
+ ssh_set_error(NULL,SSH_FATAL,"signature too big ! %d instead of %d",len,rsalen);
+ return NULL;
+ }
+ if(len<rsalen)
+ ssh_say(0,"Len %d < %d\n",len,rsalen);
+ sign->type=TYPE_RSA;
+ sign->rsa_sign=e;
+#ifdef DEBUG_CRYPTO
+ ssh_say(0,"Len : %d\n",len);
+ ssh_print_hexa("rsa signature",e->string,len);
+#endif
+ return sign;
+ default:
+ return NULL;
+ }
+}
+
+void signature_free(SIGNATURE *sign){
+ if(!sign)
+ return;
+ switch(sign->type){
+ case TYPE_DSS:
+ DSA_SIG_free(sign->dsa_sign);
+ break;
+ case TYPE_RSA:
+ case TYPE_RSA1:
+ free(sign->rsa_sign);
+ break;
+ default:
+ ssh_say(1,"freeing a signature with no type !\n");
+ }
+ free(sign);
+}
+
+/* maybe the missing function from libcrypto */
+/* i think now, maybe it's a bad idea to name it has it should have be named in libcrypto */
+static STRING *RSA_do_sign(void *payload,int len,RSA *privkey){
+ STRING *sign;
+ void *buffer=malloc(RSA_size(privkey));
+ unsigned int size;
+ int err;
+ err=RSA_sign(NID_sha1,payload,len,buffer,&size,privkey);
+ if(!err){
+ free(buffer);
+ return NULL;
+ }
+ sign=string_new(size);
+ string_fill(sign,buffer,size);
+ free(buffer);
+ return sign;
+}
+
+STRING *ssh_do_sign(SSH_SESSION *session,BUFFER *sigbuf, PRIVATE_KEY *privatekey){
+ SHACTX *ctx;
+ STRING *session_str=string_new(SHA_DIGEST_LEN);
+ char hash[SHA_DIGEST_LEN];
+ SIGNATURE *sign;
+ STRING *signature;
+ string_fill(session_str,session->current_crypto->session_id,SHA_DIGEST_LENGTH);
+ ctx=sha1_init();
+ sha1_update(ctx,session_str,string_len(session_str)+4);
+ sha1_update(ctx,buffer_get(sigbuf),buffer_get_len(sigbuf));
+ sha1_final(hash,ctx);
+ free(session_str);
+ sign=malloc(sizeof(SIGNATURE));
+ switch(privatekey->type){
+ case TYPE_DSS:
+ sign->dsa_sign=DSA_do_sign(hash,SHA_DIGEST_LENGTH,privatekey->dsa_priv);
+ sign->rsa_sign=NULL;
+ break;
+ case TYPE_RSA:
+ sign->rsa_sign=RSA_do_sign(hash,SHA_DIGEST_LENGTH,privatekey->rsa_priv);
+ sign->dsa_sign=NULL;
+ break;
+ }
+ sign->type=privatekey->type;
+ if(!sign->dsa_sign && !sign->rsa_sign){
+ ssh_set_error(session,SSH_FATAL,"Signing : openssl error");
+ signature_free(sign);
+ return NULL;
+ }
+ signature=signature_to_string(sign);
+ signature_free(sign);
+ return signature;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/libssh.h b/kftpgrabber/src/misc/libs/ssh/libssh.h
new file mode 100644
index 0000000..7fdc939
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/libssh.h
@@ -0,0 +1,218 @@
+/*
+Copyright 2003,04 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#ifndef _LIBSSH_H
+#define _LIBSSH_H
+#include "config.h"
+#include <unistd.h>
+#include <sys/select.h> /* for fd_set * */
+#include <sys/types.h>
+#define LIBSSH_VERSION "libssh-0.11-dev"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct string_struct STRING;
+typedef struct buffer_struct BUFFER;
+typedef struct public_key_struct PUBLIC_KEY;
+typedef struct private_key_struct PRIVATE_KEY;
+typedef struct ssh_options_struct SSH_OPTIONS;
+typedef struct channel_struct CHANNEL;
+typedef struct ssh_session SSH_SESSION;
+typedef struct ssh_kbdint SSH_KBDINT;
+
+/* integer values */
+typedef u_int32_t u32;
+typedef u_int16_t u16;
+typedef u_int64_t u64;
+typedef u_int8_t u8;
+
+/* the offsets of methods */
+#define KEX_ALGO 0
+#define KEX_HOSTKEY 1
+#define KEX_CRYPT_C_S 2
+#define KEX_CRYPT_S_C 3
+#define KEX_MAC_C_S 4
+#define KEX_MAC_S_C 5
+#define KEX_COMP_C_S 6
+#define KEX_COMP_S_C 7
+#define KEX_LANG_C_S 8
+#define KEX_LANG_S_C 9
+
+#define SSH_AUTH_SUCCESS 0
+#define SSH_AUTH_DENIED 1
+#define SSH_AUTH_PARTIAL 2
+#define SSH_AUTH_INFO 3
+#define SSH_AUTH_ERROR -1
+
+#define SSH_SERVER_ERROR -1
+#define SSH_SERVER_NOT_KNOWN 0
+#define SSH_SERVER_KNOWN_OK 1
+#define SSH_SERVER_KNOWN_CHANGED 2
+#define SSH_SERVER_FOUND_OTHER 3
+
+#ifndef MD5_DIGEST_LEN
+ #define MD5_DIGEST_LEN 16
+#endif
+/* errors */
+
+enum ssh_error {SSH_NO_ERROR, SSH_REQUEST_DENIED, SSH_INVALID_REQUEST, SSH_CONNECTION_LOST,SSH_FATAL,SSH_INVALID_DATA};
+char *ssh_get_error(SSH_SESSION *session); /* returns a static char array */
+enum ssh_error ssh_error_code(SSH_SESSION *session);
+void ssh_say(int priority,char *format,...);
+void ssh_set_verbosity(int num);
+
+ /* There is a verbosity level */
+ /* 3 : packet level */
+ /* 2 : protocol level */
+ /* 1 : functions level */
+ /* 0 : important messages only */
+ /* -1 : no messages */
+
+/* in client.c */
+
+SSH_SESSION *ssh_connect(SSH_OPTIONS *options);
+void ssh_disconnect(SSH_SESSION *session);
+int ssh_service_request(SSH_SESSION *session,char *service);
+char *ssh_get_issue_banner(SSH_SESSION *session);
+/* get copyright informations */
+const char *ssh_copyright();
+/* string.h */
+
+/* You can use these functions, they won't change */
+/* makestring returns a newly allocated string from a char * ptr */
+STRING *string_from_char(char *what);
+/* it returns the string len in host byte orders. str->size is big endian warning ! */
+int string_len(STRING *str);
+STRING *string_new(u32 size);
+/* string_fill copies the data in the string. it does NOT check for boundary so allocate enough place with new_string */
+/* right before */
+void string_fill(STRING *str,void *data,int len);
+/* returns a newly allocated char array with the str string and a final nul caracter */
+char *string_to_char(STRING *str);
+STRING *string_copy(STRING *str);
+
+/* deprecated */
+void ssh_crypto_init();
+
+/* useful for debug */
+void ssh_print_hexa(char *descr,unsigned char *what, int len);
+void ssh_get_random(void *,int);
+
+/* this one can be called by the client to see the hash of the public key before accepting it */
+int ssh_get_pubkey_hash(SSH_SESSION *session,char hash[MD5_DIGEST_LEN]);
+STRING *ssh_get_pubkey(SSH_SESSION *session);
+
+/* deprecated */
+int pubkey_get_hash(SSH_SESSION *session,char hash[MD5_DIGEST_LEN]);
+
+/* in connect.c */
+int ssh_fd_poll(SSH_SESSION *session);
+int ssh_select(CHANNEL **channels,CHANNEL **outchannels, int maxfd, fd_set *readfds, struct timeval *timeout);
+
+void publickey_free(PUBLIC_KEY *key);
+
+/* in keyfiles.c */
+
+PRIVATE_KEY *privatekey_from_file(SSH_SESSION *session,char *filename,int type,char *passphrase);
+void private_key_free(PRIVATE_KEY *prv);
+STRING *publickey_from_file(char *filename,int *_type);
+STRING *publickey_from_next_file(SSH_SESSION *session,char **pub_keys_path,char **keys_path,
+ char **privkeyfile,int *type,int *count);
+int ssh_is_server_known(SSH_SESSION *session);
+int ssh_write_knownhost(SSH_SESSION *session);
+
+/* in channels.c */
+
+/* this one is deprecated */
+CHANNEL *open_session_channel(SSH_SESSION *session,int window,int maxpacket);
+CHANNEL *channel_open_forward(SSH_SESSION *session,char *remotehost, int remoteport, char *sourcehost, int localport);
+CHANNEL *channel_open_session(SSH_SESSION *session);
+void channel_free(CHANNEL *channel);
+int channel_request_pty(CHANNEL *channel);
+int channel_request_pty_size(CHANNEL *channel, char *term,int cols, int rows);
+int channel_change_pty_size(CHANNEL *channel,int cols,int rows);
+int channel_request_shell(CHANNEL *channel);
+int channel_request_subsystem(CHANNEL *channel, char *system);
+int channel_request_env(CHANNEL *channel,char *name, char *value);
+int channel_request_exec(CHANNEL *channel, char *cmd);
+int channel_request_sftp(CHANNEL *channel);
+int channel_write(CHANNEL *channel,void *data,int len);
+int channel_set_write_handler(CHANNEL *channel,
+ void (*write_fct)(CHANNEL *channel, void *data, int len, void *userdefined),
+ void *user);
+int channel_set_stderr_write_handler(CHANNEL *channel,
+ void (*write_err_fct)(CHANNEL *channel, void *data, int len, void *userdefined),
+ void *user);
+int channel_send_eof(CHANNEL *channel);
+int channel_read(CHANNEL *channel, BUFFER *buffer,int bytes,int is_stderr);
+int channel_poll(CHANNEL *channel, int is_stderr);
+int channel_close(CHANNEL *channel);
+int channel_read_nonblocking(CHANNEL *channel, char *dest, int len, int is_stderr);
+int channel_is_open(CHANNEL *channel);
+/* in options.c */
+
+SSH_OPTIONS *options_new();
+SSH_OPTIONS *options_copy(SSH_OPTIONS *opt);
+int options_set_wanted_method(SSH_OPTIONS *opt,int method, char *list);
+void options_set_username(SSH_OPTIONS *opt,char *username);
+void options_set_port(SSH_OPTIONS *opt, unsigned int port);
+SSH_OPTIONS *ssh_getopt(int *argcptr, char **argv);
+void options_set_host(SSH_OPTIONS *opt, const char *host);
+/* don't connect to host, use fd instead */
+void options_set_fd(SSH_OPTIONS *opt, int fd);
+void options_set_bindaddr(SSH_OPTIONS *opt, char *bindaddr);
+void options_set_identity(SSH_OPTIONS *opt, char *identity);
+void options_set_status_callback(SSH_OPTIONS *opt, void (*callback)(void *arg, float status), void *arg);
+void options_set_timeout(SSH_OPTIONS *opt, long seconds, long usec);
+void options_set_ssh_dir(SSH_OPTIONS *opt, char *dir);
+void options_set_known_hosts_file(SSH_OPTIONS *opt, char *dir);
+/* buffer.c */
+
+BUFFER *buffer_new();
+void buffer_free(BUFFER *buffer);
+/* buffer_get returns a pointer to the begining of the buffer. no position is taken into account */
+void *buffer_get(BUFFER *buffer);
+/* same here */
+int buffer_get_len(BUFFER *buffer);
+
+
+/* in auth.c */
+/* these functions returns AUTH_ERROR is some serious error has happened,
+ AUTH_SUCCESS if success,
+ AUTH_PARTIAL if partial success,
+ AUTH_DENIED if refused */
+int ssh_userauth_none(SSH_SESSION *session,char *username);
+int ssh_userauth_password(SSH_SESSION *session,char *username,char *password);
+int ssh_userauth_offer_pubkey(SSH_SESSION *session, char *username,int type, STRING *publickey);
+int ssh_userauth_pubkey(SSH_SESSION *session, char *username, STRING *publickey, PRIVATE_KEY *privatekey);
+int ssh_userauth_autopubkey(SSH_SESSION *session, const char *passphrase);
+int ssh_userauth_kbdint(SSH_SESSION *session, char *user, char *submethods);
+int ssh_userauth_kbdint_getnprompts(SSH_SESSION *session);
+char *ssh_userauth_kbdint_getname(SSH_SESSION *session);
+char *ssh_userauth_kbdint_getinstruction(SSH_SESSION *session);
+char *ssh_userauth_kbdint_getprompt(SSH_SESSION *session, int i, char *echo);
+void ssh_userauth_kbdint_setanswer(SSH_SESSION *session, unsigned int i, char *answer);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* _LIBSSH_H */
diff --git a/kftpgrabber/src/misc/libs/ssh/misc.c b/kftpgrabber/src/misc/libs/ssh/misc.c
new file mode 100644
index 0000000..fc3cb79
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/misc.c
@@ -0,0 +1,98 @@
+/* misc.c */
+/* some misc routines than aren't really part of the ssh protocols but can be useful to the client */
+
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include <netdb.h>
+#include "libssh.h"
+
+/* if the program was executed suid root, don't trust the user ! */
+static int is_trusted(){
+ if(geteuid()!=getuid())
+ return 0;
+ return 1;
+}
+
+static char *get_homedir_from_uid(int uid){
+ struct passwd *pwd;
+ char *home;
+ while((pwd=getpwent())){
+ if(pwd->pw_uid == uid){
+ home=strdup(pwd->pw_dir);
+ endpwent();
+ return home;
+ }
+ }
+ endpwent();
+ return NULL;
+}
+
+static char *get_homedir_from_login(char *user){
+ struct passwd *pwd;
+ char *home;
+ while((pwd=getpwent())){
+ if(!strcmp(pwd->pw_name,user)){
+ home=strdup(pwd->pw_dir);
+ endpwent();
+ return home;
+ }
+ }
+ endpwent();
+ return NULL;
+}
+
+char *ssh_get_user_home_dir(){
+ char *home;
+ char *user;
+ int trusted=is_trusted();
+ if(trusted){
+ if((home=getenv("HOME")))
+ return strdup(home);
+ if((user=getenv("USER")))
+ return get_homedir_from_login(user);
+ }
+ return get_homedir_from_uid(getuid());
+}
+
+/* we have read access on file */
+int ssh_file_readaccess_ok(char *file){
+ if(!access(file,R_OK))
+ return 1;
+ return 0;
+}
+
+
+u64 ntohll(u64 a){
+#ifdef WORDS_BIGENDIAN
+ return a;
+#else
+ u32 low=a & 0xffffffff;
+ u32 high = a >> 32 ;
+ low=ntohl(low);
+ high=ntohl(high);
+ return (( ((u64)low) << 32) | ( high));
+#endif
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/options.c b/kftpgrabber/src/misc/libs/ssh/options.c
new file mode 100644
index 0000000..74ab189
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/options.c
@@ -0,0 +1,341 @@
+/* options.c */
+/* handle pre-connection options */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <pwd.h>
+#include <sys/types.h>
+#include "priv.h"
+
+SSH_OPTIONS *options_new(){
+ SSH_OPTIONS *option=malloc(sizeof(SSH_OPTIONS));
+ memset(option,0,sizeof(SSH_OPTIONS));
+ option->port=22; /* set the default port */
+ option->fd=-1;
+ return option;
+}
+
+void options_set_port(SSH_OPTIONS *opt, unsigned int port){
+ opt->port=port&0xffff;
+}
+SSH_OPTIONS *options_copy(SSH_OPTIONS *opt){
+ SSH_OPTIONS *ret=options_new();
+ int i;
+ ret->fd=opt->fd;
+ ret->port=opt->port;
+ if(opt->username)
+ ret->username=strdup(opt->username);
+ if(opt->host)
+ ret->host=strdup(opt->host);
+ if(opt->bindaddr)
+ ret->host=strdup(opt->bindaddr);
+ if(opt->identity)
+ ret->identity=strdup(opt->identity);
+ if(opt->ssh_dir)
+ ret->ssh_dir=strdup(opt->ssh_dir);
+ if(opt->known_hosts_file)
+ ret->known_hosts_file=strdup(opt->known_hosts_file);
+ for(i=0;i<10;++i)
+ if(opt->wanted_methods[i])
+ ret->wanted_methods[i]=strdup(opt->wanted_methods[i]);
+ ret->passphrase_function=opt->passphrase_function;
+ ret->connect_status_function=opt->connect_status_function;
+ ret->connect_status_arg=opt->connect_status_arg;
+ ret->timeout=opt->timeout;
+ ret->timeout_usec=opt->timeout_usec;
+ return ret;
+}
+
+void options_free(SSH_OPTIONS *opt){
+ int i;
+ if(opt->username)
+ free(opt->username);
+ if(opt->identity)
+ free(opt->identity);
+ /* we don't touch the banner. if the implementation did use it, they have to free it */
+ if(opt->host)
+ free(opt->host);
+ if(opt->bindaddr)
+ free(opt->bindaddr);
+ if(opt->ssh_dir)
+ free(opt->ssh_dir);
+ for(i=0;i<10;i++)
+ if(opt->wanted_methods[i])
+ free(opt->wanted_methods[i]);
+ memset(opt,0,sizeof(SSH_OPTIONS));
+ free(opt);
+}
+
+
+void options_set_host(SSH_OPTIONS *opt, const char *hostname){
+ char *ptr=strdup(hostname);
+ char *ptr2=strchr(ptr,'@');
+ if(opt->host) /* don't leak memory */
+ free(opt->host);
+ if(ptr2){
+ *ptr2=0;
+ opt->host=strdup(ptr2+1);
+ if(opt->username)
+ free(opt->username);
+ opt->username=strdup(ptr);
+ free(ptr);
+ } else
+ opt->host=ptr;
+}
+
+void options_set_fd(SSH_OPTIONS *opt, int fd){
+ opt->fd=fd;
+}
+
+void options_set_bindaddr(SSH_OPTIONS *opt, char *bindaddr){
+ opt->bindaddr=strdup(bindaddr);
+}
+
+void options_set_username(SSH_OPTIONS *opt,char *username){
+ opt->username=strdup(username);
+}
+
+void options_set_ssh_dir(SSH_OPTIONS *opt, char *dir){
+ char buffer[1024];
+ snprintf(buffer,1024,dir,ssh_get_user_home_dir());
+ opt->ssh_dir=strdup(buffer);
+}
+void options_set_known_hosts_file(SSH_OPTIONS *opt, char *dir){
+ char buffer[1024];
+ snprintf(buffer,1024,dir,ssh_get_user_home_dir());
+ opt->known_hosts_file=strdup(buffer);
+}
+
+void options_set_identity(SSH_OPTIONS *opt, char *identity){
+ char buffer[1024];
+ snprintf(buffer,1024,identity,ssh_get_user_home_dir());
+ opt->identity=strdup(buffer);
+}
+
+/* what's the deal here ? some options MUST be set before authentication or key exchange,
+ * otherwise default values are going to be used. what must be configurable :
+ * Public key certification method *
+ * key exchange method (dh-sha1 for instance)*
+ * c->s, s->c ciphers *
+ * c->s s->c macs *
+ * c->s s->c compression */
+
+/* they all return 0 if all went well, 1 or !=0 if not. the most common error is unmatched algo (unimplemented) */
+/* don't forget other errors can happen if no matching algo is found in sshd answer */
+
+int options_set_wanted_method(SSH_OPTIONS *opt,int method, char *list){
+ if(method > 9 || method < 0){
+ ssh_set_error(NULL,SSH_FATAL,"method %d out of range",method);
+ return -1;
+ }
+ if( (!opt->use_nonexisting_algo) && !verify_existing_algo(method,list)){
+ ssh_set_error(NULL,SSH_FATAL,"Setting method : no algorithm for method \"%s\" (%s)\n",ssh_kex_nums[method],list);
+ return -1;
+ }
+ if(opt->wanted_methods[method])
+ free(opt->wanted_methods[method]);
+ opt->wanted_methods[method]=strdup(list);
+ return 0;
+}
+
+static char *get_username_from_uid(int uid){
+ struct passwd *pwd;
+ char *user;
+ while((pwd=getpwent())){
+ if(pwd->pw_uid == uid){
+ user=strdup(pwd->pw_name);
+ endpwent();
+ return user;
+ }
+ }
+ endpwent();
+ ssh_set_error(NULL,SSH_FATAL,"uid %d doesn't exist !",uid);
+ return NULL;
+}
+
+/* this function must be called when no specific username has been asked. it has to guess it */
+int options_default_username(SSH_OPTIONS *opt){
+ char *user;
+ if(opt->username)
+ return 0;
+ user=getenv("USER");
+ if(user){
+ opt->username=strdup(user);
+ return 0;
+ }
+ user=get_username_from_uid(getuid());
+ if(user){
+ opt->username=user;
+ return 0;
+ }
+ return -1;
+}
+
+int options_default_ssh_dir(SSH_OPTIONS *opt){
+ char buffer[256];
+ if(opt->ssh_dir)
+ return 0;
+ snprintf(buffer,256,"%s/.ssh/",ssh_get_user_home_dir());
+ opt->ssh_dir=strdup(buffer);
+ return 0;
+}
+
+int options_default_known_hosts_file(SSH_OPTIONS *opt){
+ char buffer[1024];
+ if(opt->known_hosts_file)
+ return 0;
+ options_default_ssh_dir(opt);
+ snprintf(buffer,1024,"%s/known_hosts",opt->ssh_dir);
+ opt->known_hosts_file=strdup(buffer);
+ return 0;
+}
+
+void options_set_status_callback(SSH_OPTIONS *opt, void (*callback)(void *arg, float status), void *arg ){
+ opt->connect_status_function=callback;
+ opt->connect_status_arg=arg;
+}
+
+void options_set_timeout(SSH_OPTIONS *opt, long seconds,long usec){
+ opt->timeout=seconds;
+ opt->timeout_usec=usec;
+}
+
+SSH_OPTIONS *ssh_getopt(int *argcptr, char **argv){
+ int i;
+ int argc=*argcptr;
+ char *user=NULL;
+ int port=22;
+ int debuglevel=0;
+ int usersa=0;
+ int usedss=0;
+ int compress=0;
+ int cont=1;
+ char *cipher=NULL;
+ char *localaddr=NULL;
+ char *identity=NULL;
+ char **save=malloc(argc * sizeof(char *));
+ int current=0;
+
+ int saveoptind=optind; /* need to save 'em */
+ int saveopterr=opterr;
+ SSH_OPTIONS *options;
+ opterr=0; /* shut up getopt */
+ while(cont && ((i=getopt(argc,argv,"c:i:Cl:p:vb:rd12"))!=-1)){
+
+ switch(i){
+ case 'l':
+ user=optarg;
+ break;
+ case 'p':
+ port=atoi(optarg)&0xffff;
+ break;
+ case 'v':
+ debuglevel++;
+ break;
+ case 'r':
+ usersa++;
+ break;
+ case 'd':
+ usedss++;
+ break;
+ case 'c':
+ cipher=optarg;
+ break;
+ case 'i':
+ identity=optarg;
+ break;
+ case 'b':
+ localaddr=optarg;
+ break;
+ case 'C':
+ compress++;
+ break;
+ case '2':
+ break; /* only ssh2 support till now */
+ case '1':
+ ssh_set_error(NULL,SSH_FATAL,"libssh does not support SSH1 protocol");
+ cont =0;
+ break;
+ default:
+ {
+ char opt[3]="- ";
+ opt[1]=optopt;
+ save[current++]=strdup(opt);
+ if(optarg)
+ save[current++]=argv[optind+1];
+ }
+ }
+ }
+ opterr=saveopterr;
+ while(optind < argc)
+ save[current++]=argv[optind++];
+
+ if(usersa && usedss){
+ ssh_set_error(NULL,SSH_FATAL,"either RSA or DSS must be chosen");
+ cont=0;
+ }
+ ssh_set_verbosity(debuglevel);
+ optind=saveoptind;
+ if(!cont){
+ free(save);
+ return NULL;
+ }
+ /* first recopy the save vector into original's */
+ for(i=0;i<current;i++)
+ argv[i+1]=save[i]; /* don't erase argv[0] */
+ argv[current+1]=NULL;
+ *argcptr=current+1;
+ free(save);
+ /* set a new option struct */
+ options=options_new();
+ if(compress){
+ if(options_set_wanted_method(options,KEX_COMP_C_S,"zlib"))
+ cont=0;
+ if(options_set_wanted_method(options,KEX_COMP_S_C,"zlib"))
+ cont=0;
+ }
+ if(cont &&cipher){
+ if(options_set_wanted_method(options,KEX_CRYPT_C_S,cipher))
+ cont=0;
+ if(cont && options_set_wanted_method(options,KEX_CRYPT_S_C,cipher))
+ cont=0;
+ }
+ if(cont && usersa)
+ if(options_set_wanted_method(options,KEX_HOSTKEY,"ssh-rsa"))
+ cont=0;
+ if(cont && usedss)
+ if(options_set_wanted_method(options,KEX_HOSTKEY,"ssh-dss"))
+ cont=0;
+ if(cont && user)
+ options_set_username(options,user);
+ if(cont && identity)
+ options_set_identity(options,identity);
+ if(cont && localaddr)
+ options_set_bindaddr(options,localaddr);
+ options_set_port(options,port);
+ if(!cont){
+ options_free(options);
+ return NULL;
+ } else
+ return options;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/packet.c b/kftpgrabber/src/misc/libs/ssh/packet.c
new file mode 100644
index 0000000..c41e3a5
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/packet.c
@@ -0,0 +1,303 @@
+/* packet.c */
+/* packet building functions */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include "priv.h"
+#include "ssh2.h"
+#include <netdb.h>
+#include <errno.h>
+#include "crypto.h"
+
+/* XXX include selected mac size */
+static int macsize=SHA_DIGEST_LENGTH;
+
+/* completeread will read blocking until len bytes have been read */
+static int completeread(int fd, void *buffer, int len){
+ int r;
+ int total=0;
+ int toread=len;
+ while((r=read(fd,buffer+total,toread))){
+ if(r==-1)
+ return -1;
+ total += r;
+ toread-=r;
+ if(total==len)
+ return len;
+ if(r==0)
+ return 0;
+ }
+ return total ; /* connection closed */
+}
+
+int packet_read(SSH_SESSION *session){
+ u32 len;
+ void *packet=NULL;
+ char mac[30];
+ char buffer[16];
+ int be_read,i;
+ int to_be_read;
+ u8 padding;
+ unsigned int blocksize=(session->current_crypto?session->current_crypto->in_cipher->blocksize:8);
+ session->datatoread=0; /* clear the dataavailable flag */
+ memset(&session->in_packet,0,sizeof(PACKET));
+ if(session->in_buffer)
+ buffer_free(session->in_buffer);
+ session->in_buffer=buffer_new();
+
+ be_read=completeread(session->fd,buffer,blocksize);
+ if(be_read!=blocksize){
+ if(be_read<=0){
+ session->alive=0;
+ close(session->fd);
+ session->fd=-1;
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,
+ (be_read==0)?"Connection closed by remote host" : "Error reading socket");
+ return -1;
+ }
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"read_packet(): asked %d bytes, received %d",blocksize,be_read);
+ return -1;
+ }
+ len=packet_decrypt_len(session,buffer);
+ buffer_add_data(session->in_buffer,buffer,blocksize);
+
+ if(len> MAX_PACKET_LEN){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"read_packet(): Packet len too high(%uld %.8lx)",len,len);
+ return -1;
+ }
+ to_be_read=len-be_read+sizeof(u32);
+ if(to_be_read<0){
+ /* remote sshd is trying to get me ?*/
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"given numbers of bytes left to be read <0 (%d)!",to_be_read);
+ return -1;
+ }
+ /* handle the case in which the whole packet size = blocksize */
+ if(to_be_read !=0){
+ packet=malloc(to_be_read);
+ i=completeread(session->fd,packet,to_be_read);
+ if(i<=0){
+ session->alive=0;
+ close(session->fd);
+ session->fd=-1;
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Server closed connection");
+ return -1;
+ }
+ if(i!=to_be_read){
+ free(packet);
+ packet=NULL;
+ ssh_say(3,"Read only %d, wanted %d\n",i,to_be_read);
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"read_packet(): read only %d, wanted %d",i,to_be_read);
+ return -1;
+ }
+ ssh_say(3,"Read a %d bytes packet\n",len);
+ buffer_add_data(session->in_buffer,packet,to_be_read);
+ free(packet);
+ }
+ if(session->current_crypto){
+ packet_decrypt(session,buffer_get(session->in_buffer)+blocksize,buffer_get_len(session->in_buffer)-blocksize);
+ if((i=completeread(session->fd,mac,macsize))!=macsize){
+ if(i<=0){
+ session->alive=0;
+ close(session->fd);
+ session->fd=-1;
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Server closed connection");
+ return -1;
+ }
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"read_packet(): wanted %d, had %d",i,macsize);
+ return -1;
+ }
+ if(packet_hmac_verify(session,session->in_buffer,mac)){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"HMAC error");
+ return -1;
+ }
+ }
+ buffer_pass_bytes(session->in_buffer,sizeof(u32)); /*pass the size which has been processed before*/
+ if(!buffer_get_u8(session->in_buffer,&padding)){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Packet too short to read padding");
+ return -1;
+ }
+ ssh_say(3,"%hhd bytes padding\n",padding);
+ if(padding > buffer_get_rest_len(session->in_buffer)){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"invalid padding: %d (%d resting)",padding,buffer_get_rest_len(session->in_buffer));
+ ssh_print_hexa("incrimined packet",buffer_get(session->in_buffer),buffer_get_len(session->in_buffer));
+ return -1;
+ }
+ buffer_pass_bytes_end(session->in_buffer,padding);
+#ifdef HAVE_LIBZ
+ if(session->current_crypto && session->current_crypto->do_compress_in){
+ decompress_buffer(session,session->in_buffer);
+ }
+#endif
+ session->recv_seq++;
+ return 0;
+}
+
+int packet_translate(SSH_SESSION *session){
+ memset(&session->in_packet,0,sizeof(PACKET));
+ if(!session->in_buffer)
+ return -1;
+ ssh_say(3,"Final size %d\n",buffer_get_rest_len(session->in_buffer));
+ if(!buffer_get_u8(session->in_buffer,&session->in_packet.type)){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Packet too short to read type");
+ return -1;
+ }
+ ssh_say(3,"type %hhd\n",session->in_packet.type);
+ session->in_packet.valid=1;
+ return 0;
+}
+
+static int atomic_write(int fd, void *buffer, int len){
+ int written;
+ int total=0;
+ do {
+ written=write(fd,buffer,len);
+ if(written==0)
+ return 0;
+ if(written==-1)
+ return total;
+ total+=written;
+ len-=written;
+ buffer+=written;
+ } while (len > 0);
+ return total;
+}
+
+int packet_send(SSH_SESSION *session){
+ char padstring[32];
+ u32 finallen;
+ u8 padding;
+ u32 currentlen=buffer_get_len(session->out_buffer);
+ char *hmac;
+ int ret=0;
+ unsigned int blocksize=(session->current_crypto?session->current_crypto->out_cipher->blocksize:8);
+ ssh_say(3,"Writing on the wire a packet having %ld bytes before",currentlen);
+#ifdef HAVE_LIBZ
+ if(session->current_crypto && session->current_crypto->do_compress_out){
+ compress_buffer(session,session->out_buffer);
+ currentlen=buffer_get_len(session->out_buffer);
+ }
+#endif
+ padding=(blocksize- ((currentlen+5) % blocksize));
+ if(padding<4)
+ padding+=blocksize;
+ if(session->current_crypto)
+ ssh_get_random(padstring,padding);
+ else
+ memset(padstring,0,padding);
+ finallen=htonl(currentlen+padding+1);
+ ssh_say(3,",%d bytes after comp + %d padding bytes = %d bytes packet\n",currentlen,padding,(ntohl(finallen)));
+ buffer_add_data_begin(session->out_buffer,&padding,sizeof(u8));
+ buffer_add_data_begin(session->out_buffer,&finallen,sizeof(u32));
+ buffer_add_data(session->out_buffer,padstring,padding);
+ hmac=packet_encrypt(session,buffer_get(session->out_buffer),buffer_get_len(session->out_buffer));
+ if(hmac)
+ buffer_add_data(session->out_buffer,hmac,20);
+ if(atomic_write(session->fd,buffer_get(session->out_buffer),buffer_get_len(session->out_buffer))!=buffer_get_len(session->out_buffer)){
+ session->alive=0;
+ close(session->fd);
+ session->fd=-1;
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Writing packet : error on socket (or connection closed): %s",
+ strerror(errno));
+ ret=-1;
+ }
+ session->send_seq++;
+ buffer_reinit(session->out_buffer);
+ return ret;
+}
+
+void packet_parse(SSH_SESSION *session){
+ int type=session->in_packet.type;
+ u32 foo;
+ STRING *error_s;
+ char *error=NULL;
+
+ switch(type){
+ case SSH2_MSG_DISCONNECT:
+ buffer_get_u32(session->in_buffer,&foo);
+ error_s=buffer_get_ssh_string(session->in_buffer);
+ if(error_s)
+ error=string_to_char(error_s);
+ ssh_say(2,"Received SSH_MSG_DISCONNECT\n");
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Received SSH_MSG_DISCONNECT : %s",error);
+ if(error_s){
+ free(error_s);
+ free(error);
+ }
+ close(session->fd);
+ session->fd=-1;
+ session->alive=0;
+ return;
+ case SSH2_MSG_CHANNEL_WINDOW_ADJUST:
+ case SSH2_MSG_CHANNEL_DATA:
+ case SSH2_MSG_CHANNEL_EXTENDED_DATA:
+ case SSH2_MSG_CHANNEL_REQUEST:
+ case SSH2_MSG_CHANNEL_EOF:
+ case SSH2_MSG_CHANNEL_CLOSE:
+
+ channel_handle(session,type);
+ case SSH2_MSG_IGNORE:
+ return;
+ default:
+ ssh_say(0,"Received unhandled msg %d\n",type);
+ }
+}
+int packet_wait(SSH_SESSION *session,int type,int blocking){
+ while(1){
+ if(packet_read(session))
+ return -1;
+ if(packet_translate(session))
+ return -1;
+ switch(session->in_packet.type){
+ case SSH2_MSG_DISCONNECT:
+ packet_parse(session);
+ return -1;
+ case SSH2_MSG_CHANNEL_WINDOW_ADJUST:
+ case SSH2_MSG_CHANNEL_DATA:
+ case SSH2_MSG_CHANNEL_EXTENDED_DATA:
+ case SSH2_MSG_CHANNEL_REQUEST:
+ case SSH2_MSG_CHANNEL_EOF:
+ case SSH2_MSG_CHANNEL_CLOSE:
+ packet_parse(session);
+ break;;
+ case SSH2_MSG_IGNORE:
+ break;
+ default:
+ if(type && (type != session->in_packet.type)){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"waitpacket(): Received a %d type packet, was waiting for a %d\n",session->in_packet.type,type);
+ return -1;
+ }
+ return 0;
+ }
+ if(blocking==0)
+ return 0;
+ }
+ return 0;
+}
+
+void packet_clear_out(SSH_SESSION *session){
+ if(session->out_buffer)
+ buffer_reinit(session->out_buffer);
+ else
+ session->out_buffer=buffer_new();
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/priv.h b/kftpgrabber/src/misc/libs/ssh/priv.h
new file mode 100644
index 0000000..2c93081
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/priv.h
@@ -0,0 +1,384 @@
+/*
+Copyright 2003,04 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+/* priv.h file */
+/* This include file contains everything you shouldn't deal with in user programs. */
+/* Consider that anything in this file might change without notice; libssh.h file will keep */
+/* backward compatibility on binary & source */
+
+#ifndef _LIBSSH_PRIV_H
+#define _LIBSSH_PRIV_H
+#include "libssh.h"
+
+/* Debugging constants */
+
+/* Define this if you want to debug crypto systems */
+/* it's usefull when you are debugging the lib */
+/*#define DEBUG_CRYPTO */
+
+/* some constants */
+#define MAX_PACKET_LEN 262144
+#define ERROR_BUFFERLEN 1024
+#define CLIENTBANNER "SSH-2.0-" LIBSSH_VERSION
+#define KBDINT_MAX_PROMPT 256 /* more than openssh's :) */
+/* some types for public keys */
+#define TYPE_DSS 1
+#define TYPE_RSA 2
+#define TYPE_RSA1 3
+
+/* profiling constants. Don't touch them unless you know what you do */
+#define OPENSSL_CRYPTO
+#define OPENSSL_BIGNUMS
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* wrapper things */
+
+#ifdef OPENSSL_CRYPTO
+#include <openssl/dsa.h>
+#include <openssl/rsa.h>
+#include <openssl/sha.h>
+#include <openssl/md5.h>
+#include <openssl/hmac.h>
+typedef SHA_CTX SHACTX;
+typedef MD5_CTX MD5CTX;
+typedef HMAC_CTX HMACCTX;
+#ifdef MD5_DIGEST_LEN
+ #undef MD5_DIGEST_LEN
+#endif
+#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH
+#define MD5_DIGEST_LEN MD5_DIGEST_LENGTH
+
+#endif /* OPENSSL_CRYPTO */
+#ifdef OPENSSL_BIGNUMS
+#include <openssl/bn.h>
+typedef BIGNUM* bignum;
+typedef BN_CTX* bignum_CTX;
+
+#define bignum_new() BN_new()
+#define bignum_free(num) BN_clear_free(num)
+#define bignum_set_word(bn,n) BN_set_word(bn,n)
+#define bignum_bin2bn(bn,datalen,data) BN_bin2bn(bn,datalen,data)
+#define bignum_bn2hex(num) BN_bn2hex(num)
+#define bignum_rand(rnd, bits, top, bottom) BN_rand(rnd,bits,top,bottom)
+#define bignum_ctx_new() BN_CTX_new()
+#define bignum_ctx_free(num) BN_CTX_free(num)
+#define bignum_mod_exp(dest,generator,exp,modulo,ctx) BN_mod_exp(dest,generator,exp,modulo,ctx)
+#define bignum_num_bytes(num) BN_num_bytes(num)
+#define bignum_num_bits(num) BN_num_bits(num)
+#define bignum_is_bit_set(num,bit) BN_is_bit_set(num,bit)
+#define bignum_bn2bin(num,ptr) BN_bn2bin(num,ptr)
+
+#endif /* OPENSSL_BIGNUMS */
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+
+/* wrapper.c */
+MD5CTX *md5_init(void);
+void md5_update(MD5CTX *c, const void *data, unsigned long len);
+void md5_final(unsigned char *md,MD5CTX *c);
+SHACTX *sha1_init(void);
+void sha1_update(SHACTX *c, const void *data, unsigned long len);
+void sha1_final(unsigned char *md,SHACTX *c);
+void sha1(unsigned char *digest,int len,unsigned char *hash);
+#define HMAC_SHA1 1
+#define HMAC_MD5 2
+HMACCTX *hmac_init(const void *key,int len,int type);
+void hmac_update(HMACCTX *c, const void *data, unsigned long len);
+void hmac_final(HMACCTX *ctx,unsigned char *hashmacbuf,int *len);
+
+/* strings and buffers */
+/* must be 32 bits number + immediatly our data */
+struct string_struct {
+ u32 size;
+ char string[MAX_PACKET_LEN];
+} __attribute__ ((packed));
+
+
+struct buffer_struct {
+ char *data;
+ int used;
+ int allocated;
+ int pos;
+};
+
+/* i should remove it one day */
+typedef struct packet_struct {
+ int valid;
+ u32 len;
+ u8 type;
+} PACKET;
+
+typedef struct kex_struct {
+ char cookie[16];
+ char **methods;
+} KEX;
+
+struct public_key_struct {
+ int type;
+ char *type_c; /* Don't free it ! it is static */
+ DSA *dsa_pub;
+ RSA *rsa_pub;
+};
+
+struct private_key_struct {
+ int type;
+ DSA *dsa_priv;
+ RSA *rsa_priv;
+};
+
+typedef struct signature_struct {
+ int type;
+ DSA_SIG *dsa_sign;
+ STRING *rsa_sign;
+} SIGNATURE;
+
+struct ssh_options_struct {
+ char *clientbanner; /* explicit banner to send */
+ char *username;
+ char *host;
+ char *bindaddr;
+ char *identity;
+ char *ssh_dir;
+ char *known_hosts_file;
+ int fd; /* specificaly wanted file descriptor, don't connect host */
+ int port;
+ int dont_verify_hostkey; /* Don't spare time, don't check host key ! unneeded to say it's dangerous and not safe */
+ int use_nonexisting_algo; /* if user sets a not supported algorithm for kex, don't complain */
+ char *wanted_methods[10]; /* the kex methods can be choosed. better use the kex fonctions to do that */
+ void *wanted_cookie; /* wants a specific cookie to be sent ? if null, generate a new one */
+ void *passphrase_function; /* this functions will be called if a keyphrase is needed. look keyfiles.c for more info */
+ void (*connect_status_function)(void *arg, float status); /* status callback function */
+ void *connect_status_arg; /* arbitrary argument */
+ long timeout; /* seconds */
+ long timeout_usec;
+ };
+
+typedef struct ssh_crypto_struct {
+ bignum e,f,x,k;
+ char session_id[SHA_DIGEST_LEN];
+
+ char encryptIV[SHA_DIGEST_LEN];
+ char decryptIV[SHA_DIGEST_LEN];
+
+ char decryptkey[SHA_DIGEST_LEN*2];
+ char encryptkey[SHA_DIGEST_LEN*2];
+
+ char encryptMAC[SHA_DIGEST_LEN];
+ char decryptMAC[SHA_DIGEST_LEN];
+ char hmacbuf[EVP_MAX_MD_SIZE];
+ struct crypto_struct *in_cipher, *out_cipher; /* the cipher structures/objects */
+ STRING *server_pubkey;
+ char *server_pubkey_type;
+ int do_compress_out; /* idem */
+ int do_compress_in; /* don't set them, set the option instead */
+ void *compress_out_ctx; /* don't touch it */
+ void *compress_in_ctx; /* really, don't */
+} CRYPTO;
+
+struct channel_struct {
+ struct channel_struct *prev;
+ struct channel_struct *next;
+ SSH_SESSION *session; /* SSH_SESSION pointer */
+ u32 local_channel;
+ u32 local_window;
+ int local_eof;
+ u32 local_maxpacket;
+ u32 remote_channel;
+ u32 remote_window;
+ int remote_eof; /* end of file received */
+ u32 remote_maxpacket;
+ int open; /* shows if the channel is still opened */
+ void (*write_fct)(struct channel_struct *channel, void *data, int len, void *userarg);
+ /* this write function is a callback on some userdefined function which is used for writing datas *coming from remote ssh* */
+ /* use channel_write() to write into a ssh pipe */
+ void (*write_err_fct)(struct channel_struct *channel, void *data, int len, void *userarg);
+ /* same as write_fct for stderr */
+ BUFFER *stdout_buffer;
+ BUFFER *stderr_buffer;
+ void *userarg;
+};
+
+struct ssh_session {
+ int fd;
+ SSH_OPTIONS *options;
+ char *serverbanner;
+ char *clientbanner;
+ int protoversion;
+ u32 send_seq;
+ u32 recv_seq;
+ int connected; /* !=0 when the user got a session handle */
+ int alive;
+ int auth_service_asked;
+ int datatoread; /* reading now on socket will not block */
+ STRING *banner; /* that's the issue banner from the server */
+ BUFFER *in_buffer;
+ PACKET in_packet;
+ BUFFER *out_buffer;
+ KEX server_kex;
+ KEX client_kex;
+ BUFFER *in_hashbuf;
+ BUFFER *out_hashbuf;
+ CRYPTO *current_crypto;
+ CRYPTO *next_crypto; /* next_crypto is going to be used after a SSH2_MSG_NEWKEYS */
+ CHANNEL *channels; /* linked list of channels */
+ int maxchannel;
+ int error_code;
+ char error_buffer[ERROR_BUFFERLEN];
+ struct ssh_kbdint *kbdint;
+};
+
+struct ssh_kbdint {
+ u32 nprompts;
+ char *name;
+ char *instruction;
+ char **prompts;
+ char *echo; /* bool array */
+ char **answers;
+};
+
+/* errors.c */
+void ssh_set_error(SSH_SESSION *session,enum ssh_error code,char *descr,...);
+
+/* in dh.c */
+/* DH key generation */
+void dh_generate_e(SSH_SESSION *session);
+void dh_generate_x(SSH_SESSION *session);
+STRING *dh_get_e(SSH_SESSION *session);
+void dh_import_f(SSH_SESSION *session,STRING *f_string);
+void dh_import_pubkey(SSH_SESSION *session,STRING *pubkey_string);
+void dh_build_k(SSH_SESSION *session);
+void make_sessionid(SSH_SESSION *session);
+/* add data for the final cookie */
+void hashbufin_add_cookie(SSH_SESSION *session,unsigned char *cookie);
+void hashbufout_add_cookie(SSH_SESSION *session);
+void generate_session_keys(SSH_SESSION *session);
+/* returns 1 if server signature ok, 0 otherwise. The NEXT crypto is checked, not the current one */
+int signature_verify(SSH_SESSION *session,STRING *signature);
+bignum make_string_bn(STRING *string);
+STRING *make_bignum_string(bignum num);
+
+/* in crypt.c */
+u32 packet_decrypt_len(SSH_SESSION *session,char *crypted);
+int packet_decrypt(SSH_SESSION *session, void *packet,unsigned int len);
+char *packet_encrypt(SSH_SESSION *session,void *packet,unsigned int len);
+ /* it returns the hmac buffer if exists*/
+int packet_hmac_verify(SSH_SESSION *session,BUFFER *buffer,char *mac);
+
+/* in packet.c */
+void packet_clear_out(SSH_SESSION *session);
+void packet_parse(SSH_SESSION *session);
+int packet_send(SSH_SESSION *session);
+int packet_read(SSH_SESSION *session);
+int packet_translate(SSH_SESSION *session);
+int packet_wait(SSH_SESSION *session,int type,int blocking);
+
+/* connect.c */
+SSH_SESSION *ssh_session_new();
+int ssh_connect_host(const char *host,const char *bind_addr, int port, long timeout, long usec);
+
+/* in kex.c */
+extern char *ssh_kex_nums[];
+void send_kex(SSH_SESSION *session,int server_kex);
+void list_kex(KEX *kex);
+int set_kex(SSH_SESSION *session);
+int ssh_get_kex(SSH_SESSION *session, int server_kex);
+int verify_existing_algo(int algo,char *name);
+char **space_tokenize(char *chain);
+
+/* in keys.c */
+char *ssh_type_to_char(int type);
+PUBLIC_KEY *publickey_make_dss(BUFFER *buffer);
+PUBLIC_KEY *publickey_make_rsa(BUFFER *buffer);
+PUBLIC_KEY *publickey_from_string(STRING *pubkey_s);
+SIGNATURE *signature_from_string(STRING *signature,PUBLIC_KEY *pubkey,int needed_type);
+void signature_free(SIGNATURE *sign);
+STRING *ssh_do_sign(SSH_SESSION *session,BUFFER *sigbuf, PRIVATE_KEY *privatekey);
+
+/* channel.c */
+void channel_handle(SSH_SESSION *session, int type);
+
+/* options.c */
+void options_free(SSH_OPTIONS *opt);
+/* this function must be called when no specific username has been asked. it has to guess it */
+int options_default_username(SSH_OPTIONS *opt);
+int options_default_ssh_dir(SSH_OPTIONS *opt);
+int options_default_known_hosts_file(SSH_OPTIONS *opt);
+
+/* buffer.c */
+void buffer_add_ssh_string(BUFFER *buffer,STRING *string);
+void buffer_add_u8(BUFFER *buffer, u8 data);
+void buffer_add_u32(BUFFER *buffer, u32 data);
+void buffer_add_u64(BUFFER *buffer,u64 data);
+void buffer_add_data(BUFFER *buffer, void *data, int len);
+void buffer_add_data_begin(BUFFER *buffer,void *data,int len);
+void buffer_add_buffer(BUFFER *buffer, BUFFER *source);
+void buffer_reinit(BUFFER *buffer);
+
+/* buffer_get_rest returns a pointer to the current position into the buffer */
+void *buffer_get_rest(BUFFER *buffer);
+/* buffer_get_rest_len returns the number of bytes which can be read */
+int buffer_get_rest_len(BUFFER *buffer);
+
+/* buffer_read_*() returns the number of bytes read, except for ssh strings */
+int buffer_get_u8(BUFFER *buffer,u8 *data);
+int buffer_get_u32(BUFFER *buffer,u32 *data);
+int buffer_get_u64(BUFFER *buffer, u64 *data);
+
+int buffer_get_data(BUFFER *buffer,void *data,int requestedlen);
+/* buffer_get_ssh_string() is an exception. if the String read is too large or invalid, it will answer NULL. */
+STRING *buffer_get_ssh_string(BUFFER *buffer);
+/* buffer_pass_bytes acts as if len bytes have been read (used for padding) */
+int buffer_pass_bytes_end(BUFFER *buffer,int len);
+int buffer_pass_bytes(BUFFER *buffer, int len);
+
+/* in base64.c */
+BUFFER *base64_to_bin(char *source);
+char *bin_to_base64(unsigned char *source, int len);
+
+/* gzip.c */
+int compress_buffer(SSH_SESSION *session,BUFFER *buf);
+int decompress_buffer(SSH_SESSION *session,BUFFER *buf);
+
+/* wrapper.c */
+int crypt_set_algorithms(SSH_SESSION *);
+CRYPTO *crypto_new();
+void crypto_free(CRYPTO *crypto);
+bignum bignum_new();
+
+/* in misc.c */
+/* gets the user home dir. */
+char *ssh_get_user_home_dir();
+int ssh_file_readaccess_ok(char *file);
+
+/* macro for byte ordering */
+u64 ntohll(u64);
+#define htonll(x) ntohll(x)
+
+
+#ifdef __cplusplus
+} ;
+#endif
+
+#endif /* _LIBSSH_PRIV_H */
diff --git a/kftpgrabber/src/misc/libs/ssh/sftp.c b/kftpgrabber/src/misc/libs/ssh/sftp.c
new file mode 100644
index 0000000..9895456
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/sftp.c
@@ -0,0 +1,1289 @@
+/* scp.c contains the needed function to work with file transfer protocol over ssh*/
+/* don't look further if you believe this is just FTP over some tunnel. It IS different */
+/* This file contains code written by Nick Zitzmann */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+
+#include <string.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include "priv.h"
+#include "ssh2.h"
+#include "sftp.h"
+#ifndef NO_SFTP
+/* here how it works : sftp commands are channeled by the ssh sftp subsystem. */
+/* every packet are sent/read using a SFTP_PACKET type structure. */
+/* into these packets, most of the server answers are messages having an ID and */
+/* having a message specific part. it is described by SFTP_MESSAGE */
+/* when reading a message, the sftp system puts it into the queue, so the process having asked for it */
+/* can fetch it, while continuing to read for other messages (it is inspecified in which order messages may */
+/* be sent back to the client */
+
+
+/* functions */
+static void sftp_packet_free(SFTP_PACKET *packet);
+void sftp_enqueue(SFTP_SESSION *session, SFTP_MESSAGE *msg);
+static void sftp_message_free(SFTP_MESSAGE *msg);
+
+SFTP_SESSION *sftp_new(SSH_SESSION *session){
+ SFTP_SESSION *sftp=malloc(sizeof(SFTP_SESSION));
+ memset(sftp,0,sizeof(SFTP_SESSION));
+ sftp->session=session;
+ sftp->channel=open_session_channel(session,131000,32000);
+ if(!sftp->channel){
+ free(sftp);
+ return NULL;
+ }
+ if(channel_request_sftp(sftp->channel)){
+ sftp_free(sftp);
+ return NULL;
+ }
+ return sftp;
+}
+
+void sftp_free(SFTP_SESSION *sftp){
+ struct request_queue *ptr;
+ channel_send_eof(sftp->channel);
+ /* let libssh handle the channel closing from the server reply */
+ ptr=sftp->queue;
+ while(ptr){
+ struct request_queue *old;
+ sftp_message_free(ptr->message);
+ old=ptr->next;
+ free(ptr);
+ ptr=old;
+ }
+ memset(sftp,0,sizeof(*sftp));
+ free(sftp);
+}
+
+int sftp_packet_write(SFTP_SESSION *sftp,u8 type, BUFFER *payload){
+ u32 size;
+ buffer_add_data_begin(payload,&type,sizeof(u8));
+ size=htonl(buffer_get_len(payload));
+ buffer_add_data_begin(payload,&size,sizeof(u32));
+ size=channel_write(sftp->channel,buffer_get(payload),buffer_get_len(payload));
+ if(size != buffer_get_len(payload)){
+ ssh_say(1,"had to write %d bytes, wrote only %d\n",buffer_get_len(payload),size);
+ }
+ return size;
+}
+
+SFTP_PACKET *sftp_packet_read(SFTP_SESSION *sftp){
+ SFTP_PACKET *packet=malloc(sizeof(SFTP_PACKET));
+ u32 size;
+ packet->sftp=sftp;
+ packet->payload=buffer_new();
+ if(channel_read(sftp->channel,packet->payload,4,0)<=0){
+ buffer_free(packet->payload);
+ free(packet);
+ return NULL;
+ }
+ buffer_get_u32(packet->payload,&size);
+ size=ntohl(size);
+ if(channel_read(sftp->channel,packet->payload,1,0)<=0){
+ buffer_free(packet->payload);
+ free(packet);
+ return NULL;
+ }
+ buffer_get_u8(packet->payload,&packet->type);
+ if(size>1)
+ if(channel_read(sftp->channel,packet->payload,size-1,0)<=0){
+ buffer_free(packet->payload);
+ free(packet);
+ return NULL;
+ }
+ return packet;
+}
+
+static SFTP_MESSAGE *sftp_message_new(){
+ SFTP_MESSAGE *msg=malloc(sizeof(SFTP_MESSAGE));
+ memset(msg,0,sizeof(*msg));
+ msg->payload=buffer_new();
+ return msg;
+}
+
+static void sftp_message_free(SFTP_MESSAGE *msg){
+ if(msg->payload)
+ buffer_free(msg->payload);
+ free(msg);
+}
+
+SFTP_MESSAGE *sftp_get_message(SFTP_PACKET *packet){
+ SFTP_MESSAGE *msg=sftp_message_new();
+ msg->sftp=packet->sftp;
+ msg->packet_type=packet->type;
+ if((packet->type!=SSH_FXP_STATUS)&&(packet->type!=SSH_FXP_HANDLE) &&
+ (packet->type != SSH_FXP_DATA) && (packet->type != SSH_FXP_ATTRS)
+ && (packet->type != SSH_FXP_NAME)){
+ ssh_set_error(packet->sftp->session,SSH_INVALID_DATA,"get_message : unknown packet type %d\n",packet->type);
+ sftp_message_free(msg);
+ return NULL;
+ }
+ if(buffer_get_u32(packet->payload,&msg->id)!=sizeof(u32)){
+ ssh_set_error(packet->sftp->session,SSH_INVALID_DATA,"invalid packet %d : no ID",packet->type);
+ sftp_message_free(msg);
+ return NULL;
+ }
+ ssh_say(2,"packet with id %d type %d\n",msg->id,msg->packet_type);
+ buffer_add_data(msg->payload,buffer_get_rest(packet->payload),buffer_get_rest_len(packet->payload));
+ return msg;
+}
+
+int sftp_read_and_dispatch(SFTP_SESSION *session){
+ SFTP_PACKET *packet;
+ SFTP_MESSAGE *message=NULL;
+ packet=sftp_packet_read(session);
+ if(!packet)
+ return -1; /* something nasty happened reading the packet */
+ message=sftp_get_message(packet);
+ sftp_packet_free(packet);
+ if(!message)
+ return -1;
+ sftp_enqueue(session,message);
+ return 0;
+}
+
+static void sftp_packet_free(SFTP_PACKET *packet){
+ if(packet->payload)
+ buffer_free(packet->payload);
+ free(packet);
+}
+
+int sftp_init(SFTP_SESSION *sftp){
+ SFTP_PACKET *packet;
+ BUFFER *buffer=buffer_new();
+ STRING *ext_name_s=NULL, *ext_data_s=NULL;
+ char *ext_name,*ext_data;
+ u32 version=htonl(LIBSFTP_VERSION);
+ buffer_add_u32(buffer,version);
+ sftp_packet_write(sftp,SSH_FXP_INIT,buffer);
+ buffer_free(buffer);
+ packet=sftp_packet_read(sftp);
+ if(!packet)
+ return -1;
+ if(packet->type != SSH_FXP_VERSION){
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received a %d messages instead of SSH_FXP_VERSION",packet->type);
+ sftp_packet_free(packet);
+ return -1;
+ }
+ buffer_get_u32(packet->payload,&version);
+ version=ntohl(version);
+ if(!(ext_name_s=buffer_get_ssh_string(packet->payload))||!(ext_data_s=buffer_get_ssh_string(packet->payload)))
+ ssh_say(2,"sftp server version %d\n",version);
+ else{
+ ext_name=string_to_char(ext_name_s);
+ ext_data=string_to_char(ext_data_s);
+ ssh_say(2,"sftp server version %d (%s,%s)\n",version,ext_name,ext_data);
+ free(ext_name);
+ free(ext_data);
+ }
+ if(ext_name_s)
+ free(ext_name_s);
+ if(ext_data_s)
+ free(ext_data_s);
+ sftp_packet_free(packet);
+ sftp->server_version=version;
+ return 0;
+}
+
+REQUEST_QUEUE *request_queue_new(SFTP_MESSAGE *msg){
+ REQUEST_QUEUE *queue=malloc(sizeof(REQUEST_QUEUE));
+ memset(queue,0,sizeof(REQUEST_QUEUE));
+ queue->message=msg;
+ return queue;
+}
+
+void request_queue_free(REQUEST_QUEUE *queue){
+ memset(queue,0,sizeof(*queue));
+ free(queue);
+}
+
+void sftp_enqueue(SFTP_SESSION *session, SFTP_MESSAGE *msg){
+ REQUEST_QUEUE *queue=request_queue_new(msg);
+ REQUEST_QUEUE *ptr;
+ ssh_say(2,"queued msg type %d id %d\n",msg->id,msg->packet_type);
+ if(!session->queue)
+ session->queue=queue;
+ else {
+ ptr=session->queue;
+ while(ptr->next){
+ ptr=ptr->next; /* find end of linked list */
+ }
+ ptr->next=queue; /* add it on bottom */
+ }
+}
+
+/* pulls of a message from the queue based on the ID. returns null if no message has been found */
+SFTP_MESSAGE *sftp_dequeue(SFTP_SESSION *session, u32 id){
+ REQUEST_QUEUE *queue,*prev=NULL;
+ SFTP_MESSAGE *msg;
+ if(session->queue==NULL){
+ return NULL;
+ }
+ queue=session->queue;
+ while(queue){
+ if(queue->message->id==id){
+ /* remove from queue */
+ if(prev==NULL){
+ session->queue=queue->next;
+ } else {
+ prev->next=queue->next;
+ }
+ msg=queue->message;
+ request_queue_free(queue);
+ ssh_say(2,"dequeued msg id %d type %d\n",msg->id,msg->packet_type);
+ return msg;
+ }
+ prev=queue;
+ queue=queue->next;
+ }
+ return NULL;
+}
+
+/* assigns a new sftp ID for new requests and assures there is no collision between them. */
+u32 sftp_get_new_id(SFTP_SESSION *session){
+ return ++session->id_counter;
+}
+
+STATUS_MESSAGE *parse_status_msg(SFTP_MESSAGE *msg){
+ STATUS_MESSAGE *status;
+ if(msg->packet_type != SSH_FXP_STATUS){
+ ssh_set_error(msg->sftp->session, SSH_INVALID_DATA,"Not a ssh_fxp_status message passed in !");
+ return NULL;
+ }
+ status=malloc(sizeof(STATUS_MESSAGE));
+ memset(status,0,sizeof(*status));
+ status->id=msg->id;
+ if( (buffer_get_u32(msg->payload,&status->status)!= 4)
+ || !(status->error=buffer_get_ssh_string(msg->payload)) ||
+ !(status->lang=buffer_get_ssh_string(msg->payload))){
+ if(status->error)
+ free(status->error);
+ /* status->lang never get allocated if something failed */
+ free(status);
+ ssh_set_error(msg->sftp->session,SSH_INVALID_DATA,"invalid SSH_FXP_STATUS message");
+ return NULL;
+ }
+ status->status=ntohl(status->status);
+ status->errormsg=string_to_char(status->error);
+ status->langmsg=string_to_char(status->lang);
+ return status;
+}
+
+void status_msg_free(STATUS_MESSAGE *status){
+ if(status->errormsg)
+ free(status->errormsg);
+ if(status->error)
+ free(status->error);
+ if(status->langmsg)
+ free(status->langmsg);
+ if(status->lang)
+ free(status->lang);
+ free(status);
+}
+
+SFTP_FILE *parse_handle_msg(SFTP_MESSAGE *msg){
+ SFTP_FILE *file;
+ if(msg->packet_type != SSH_FXP_HANDLE){
+ ssh_set_error(msg->sftp->session,SSH_INVALID_DATA,"Not a ssh_fxp_handle message passed in !");
+ return NULL;
+ }
+ file=malloc(sizeof(SFTP_FILE));
+ memset(file,0,sizeof(*file));
+ file->sftp=msg->sftp;
+ file->handle=buffer_get_ssh_string(msg->payload);
+ file->offset=0;
+ file->eof=0;
+ if(!file->handle){
+ ssh_set_error(msg->sftp->session,SSH_INVALID_DATA,"Invalid SSH_FXP_HANDLE message");
+ free(file);
+ return NULL;
+ }
+ return file;
+}
+
+SFTP_DIR *sftp_opendir(SFTP_SESSION *sftp, char *path){
+ SFTP_DIR *dir=NULL;
+ SFTP_FILE *file;
+ STATUS_MESSAGE *status;
+ SFTP_MESSAGE *msg=NULL;
+ STRING *path_s;
+ BUFFER *payload=buffer_new();
+ u32 id=sftp_get_new_id(sftp);
+ buffer_add_u32(payload,id);
+ path_s=string_from_char(path);
+ buffer_add_ssh_string(payload,path_s);
+ free(path_s);
+ sftp_packet_write(sftp,SSH_FXP_OPENDIR,payload);
+ buffer_free(payload);
+ while(!msg){
+ if(sftp_read_and_dispatch(sftp))
+ /* something nasty has happened */
+ return NULL;
+ msg=sftp_dequeue(sftp,id);
+ }
+ switch (msg->packet_type){
+ case SSH_FXP_STATUS:
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return NULL;
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
+ status_msg_free(status);
+ return NULL;
+ case SSH_FXP_HANDLE:
+ file=parse_handle_msg(msg);
+ sftp_message_free(msg);
+ if(file){
+ dir=malloc(sizeof(SFTP_DIR));
+ memset(dir,0,sizeof(*dir));
+ dir->sftp=sftp;
+ dir->name=strdup(path);
+ dir->handle=file->handle;
+ free(file);
+ }
+ return dir;
+ default:
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received message %d during opendir!",msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return NULL;
+}
+
+/* parse the attributes from a payload from some messages */
+/* i coded it on baselines from the protocol version 4. */
+/* please excuse me for the inaccuracy of the code. it isn't my fault, it's sftp draft's one */
+/* this code is dead anyway ... */
+/* version 4 specific code */
+SFTP_ATTRIBUTES *sftp_parse_attr_4(SFTP_SESSION *sftp,BUFFER *buf,int expectnames){
+ u32 flags=0;
+ SFTP_ATTRIBUTES *attr=malloc(sizeof(SFTP_ATTRIBUTES));
+ STRING *owner=NULL;
+ STRING *group=NULL;
+ int ok=0;
+ memset(attr,0,sizeof(*attr));
+ /* it isn't really a loop, but i use it because it's like a try..catch.. construction in C */
+ do {
+ if(buffer_get_u32(buf,&flags)!=4)
+ break;
+ flags=ntohl(flags);
+ attr->flags=flags;
+ if(flags & SSH_FILEXFER_ATTR_SIZE){
+ if(buffer_get_u64(buf,&attr->size)!=8)
+ break;
+ attr->size=ntohll(attr->size);
+ }
+ if(flags & SSH_FILEXFER_ATTR_OWNERGROUP){
+ if(!(owner=buffer_get_ssh_string(buf)))
+ break;
+ if(!(group=buffer_get_ssh_string(buf)))
+ break;
+ }
+ if(flags & SSH_FILEXFER_ATTR_PERMISSIONS){
+ if(buffer_get_u32(buf,&attr->permissions)!=4)
+ break;
+ attr->permissions=ntohl(attr->permissions);
+ }
+ if(flags & SSH_FILEXFER_ATTR_ACCESSTIME){
+ if(buffer_get_u64(buf,&attr->atime64)!=8)
+ break;
+ attr->atime64=ntohll(attr->atime64);
+ }
+ if(flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES){
+ if(buffer_get_u32(buf,&attr->atime_nseconds)!=4)
+ break;
+ attr->atime_nseconds=ntohl(attr->atime_nseconds);
+ }
+ if(flags & SSH_FILEXFER_ATTR_CREATETIME){
+ if(buffer_get_u64(buf,&attr->createtime)!=8)
+ break;
+ attr->createtime=ntohll(attr->createtime);
+ }
+ if(flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES){
+ if(buffer_get_u32(buf,&attr->createtime_nseconds)!=4)
+ break;
+ attr->createtime_nseconds=ntohl(attr->createtime_nseconds);
+ }
+ if(flags & SSH_FILEXFER_ATTR_MODIFYTIME){
+ if(buffer_get_u64(buf,&attr->mtime64)!=8)
+ break;
+ attr->mtime64=ntohll(attr->mtime64);
+ }
+ if(flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES){
+ if(buffer_get_u32(buf,&attr->mtime_nseconds)!=4)
+ break;
+ attr->mtime_nseconds=ntohl(attr->mtime_nseconds);
+ }
+ if(flags & SSH_FILEXFER_ATTR_ACL){
+ if(!(attr->acl=buffer_get_ssh_string(buf)))
+ break;
+ }
+ if (flags & SSH_FILEXFER_ATTR_EXTENDED){
+ if(buffer_get_u32(buf,&attr->extended_count)!=4)
+ break;
+ attr->extended_count=ntohl(attr->extended_count);
+ while(attr->extended_count && (attr->extended_type=buffer_get_ssh_string(buf))
+ && (attr->extended_data=buffer_get_ssh_string(buf))){
+ attr->extended_count--;
+ }
+ if(attr->extended_count)
+ break;
+ }
+ ok=1;
+ } while (0);
+ if(!ok){
+ /* break issued somewhere */
+ if(owner)
+ free(owner);
+ if(group)
+ free(group);
+ if(attr->acl)
+ free(attr->acl);
+ if(attr->extended_type)
+ free(attr->extended_type);
+ if(attr->extended_data)
+ free(attr->extended_data);
+ free(attr);
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Invalid ATTR structure");
+ return NULL;
+ }
+ /* everything went smoothly */
+ if(owner){
+ attr->owner=string_to_char(owner);
+ free(owner);
+ }
+ if(group){
+ attr->group=string_to_char(group);
+ free(group);
+ }
+ return attr;
+}
+
+/* Version 3 code. it is the only one really supported (the draft for the 4 misses clarifications) */
+/* maybe a paste of the draft is better than the code */
+/*
+ uint32 flags
+ uint64 size present only if flag SSH_FILEXFER_ATTR_SIZE
+ uint32 uid present only if flag SSH_FILEXFER_ATTR_UIDGID
+ uint32 gid present only if flag SSH_FILEXFER_ATTR_UIDGID
+ uint32 permissions present only if flag SSH_FILEXFER_ATTR_PERMISSIONS
+ uint32 atime present only if flag SSH_FILEXFER_ACMODTIME
+ uint32 mtime present only if flag SSH_FILEXFER_ACMODTIME
+ uint32 extended_count present only if flag SSH_FILEXFER_ATTR_EXTENDED
+ string extended_type
+ string extended_data
+ ... more extended data (extended_type - extended_data pairs),
+ so that number of pairs equals extended_count */
+SFTP_ATTRIBUTES *sftp_parse_attr_3(SFTP_SESSION *sftp,BUFFER *buf,int expectname){
+ u32 flags=0;
+ STRING *name;
+ STRING *longname;
+ SFTP_ATTRIBUTES *attr=malloc(sizeof(SFTP_ATTRIBUTES));
+ int ok=0;
+ memset(attr,0,sizeof(*attr));
+ /* it isn't really a loop, but i use it because it's like a try..catch.. construction in C */
+ do {
+ if(expectname){
+ if(!(name=buffer_get_ssh_string(buf)))
+ break;
+ attr->name=string_to_char(name);
+ free(name);
+ ssh_say(2,"name : %s\n",attr->name);
+ if(!(longname=buffer_get_ssh_string(buf)))
+ break;
+ attr->longname=string_to_char(longname);
+ free(longname);
+ }
+ if(buffer_get_u32(buf,&flags)!=sizeof(u32))
+ break;
+ flags=ntohl(flags);
+ attr->flags=flags;
+ ssh_say(2,"flags : %.8lx\n",flags);
+ if(flags & SSH_FILEXFER_ATTR_SIZE){
+ if(buffer_get_u64(buf,&attr->size)!=sizeof(u64))
+ break;
+ attr->size=ntohll(attr->size);
+ ssh_say(2,"size : %lld\n",attr->size);
+ }
+ if(flags & SSH_FILEXFER_ATTR_UIDGID){
+ if(buffer_get_u32(buf,&attr->uid)!=sizeof(u32))
+ break;
+ if(buffer_get_u32(buf,&attr->gid)!=sizeof(u32))
+ break;
+ attr->uid=ntohl(attr->uid);
+ attr->gid=ntohl(attr->gid);
+ }
+ if(flags & SSH_FILEXFER_ATTR_PERMISSIONS){
+ if(buffer_get_u32(buf,&attr->permissions)!=sizeof(u32))
+ break;
+ attr->permissions=ntohl(attr->permissions);
+ }
+ if(flags & SSH_FILEXFER_ATTR_ACMODTIME){
+ if(buffer_get_u32(buf,&attr->atime)!=sizeof(u32))
+ break;
+ attr->atime=ntohl(attr->atime);
+ if(buffer_get_u32(buf,&attr->mtime)!=sizeof(u32))
+ break;
+ attr->mtime=ntohl(attr->mtime);
+ }
+ if (flags & SSH_FILEXFER_ATTR_EXTENDED){
+ if(buffer_get_u32(buf,&attr->extended_count)!=sizeof(u32))
+ break;
+ attr->extended_count=ntohl(attr->extended_count);
+ while(attr->extended_count && (attr->extended_type=buffer_get_ssh_string(buf))
+ && (attr->extended_data=buffer_get_ssh_string(buf))){
+ attr->extended_count--;
+ }
+ if(attr->extended_count)
+ break;
+ }
+ ok=1;
+ } while (0);
+ if(!ok){
+ /* break issued somewhere */
+ if(attr->name)
+ free(attr->name);
+ if(attr->extended_type)
+ free(attr->extended_type);
+ if(attr->extended_data)
+ free(attr->extended_data);
+ free(attr);
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Invalid ATTR structure");
+ return NULL;
+ }
+ /* everything went smoothly */
+ return attr;
+}
+
+void buffer_add_attributes(BUFFER *buffer, SFTP_ATTRIBUTES *attr){
+ u32 flags=(attr?attr->flags:0);
+ flags &= (SSH_FILEXFER_ATTR_SIZE | SSH_FILEXFER_ATTR_UIDGID | SSH_FILEXFER_ATTR_PERMISSIONS | SSH_FILEXFER_ATTR_ACMODTIME);
+ buffer_add_u32(buffer,htonl(flags));
+ if(attr){
+ if (flags & SSH_FILEXFER_ATTR_SIZE)
+ {
+ buffer_add_u64(buffer, htonll(attr->size));
+ }
+ if(flags & SSH_FILEXFER_ATTR_UIDGID){
+ buffer_add_u32(buffer,htonl(attr->uid));
+ buffer_add_u32(buffer,htonl(attr->gid));
+ }
+ if(flags & SSH_FILEXFER_ATTR_PERMISSIONS){
+ buffer_add_u32(buffer,htonl(attr->permissions));
+ }
+ if (flags & SSH_FILEXFER_ATTR_ACMODTIME)
+ {
+ buffer_add_u32(buffer, htonl(attr->atime));
+ buffer_add_u32(buffer, htonl(attr->mtime));
+ }
+ }
+}
+
+
+SFTP_ATTRIBUTES *sftp_parse_attr(SFTP_SESSION *session, BUFFER *buf,int expectname){
+ switch(session->server_version){
+ case 4:
+ return sftp_parse_attr_4(session,buf,expectname);
+ case 3:
+ return sftp_parse_attr_3(session,buf,expectname);
+ default:
+ ssh_set_error(session->session,SSH_INVALID_DATA,"Version %d unsupported by client",session->server_version);
+ return NULL;
+ }
+ return NULL;
+}
+
+int sftp_server_version(SFTP_SESSION *sftp){
+ return sftp->server_version;
+}
+
+SFTP_ATTRIBUTES *sftp_readdir(SFTP_SESSION *sftp, SFTP_DIR *dir){
+ BUFFER *payload;
+ u32 id;
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status;
+ SFTP_ATTRIBUTES *attr;
+ if(!dir->buffer){
+ payload=buffer_new();
+ id=sftp_get_new_id(sftp);
+ buffer_add_u32(payload,id);
+ buffer_add_ssh_string(payload,dir->handle);
+ sftp_packet_write(sftp,SSH_FXP_READDIR,payload);
+ buffer_free(payload);
+ ssh_say(2,"sent a ssh_fxp_readdir with id %d\n",id);
+ while(!msg){
+ if(sftp_read_and_dispatch(sftp))
+ /* something nasty has happened */
+ return NULL;
+ msg=sftp_dequeue(sftp,id);
+ }
+ switch (msg->packet_type){
+ case SSH_FXP_STATUS:
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return NULL;
+ if(status->status==SSH_FX_EOF){
+ dir->eof=1;
+ status_msg_free(status);
+ return NULL;
+ }
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Unknown error status : %d",status->status);
+ status_msg_free(status);
+ return NULL;
+ case SSH_FXP_NAME:
+ buffer_get_u32(msg->payload,&dir->count);
+ dir->count=ntohl(dir->count);
+ dir->buffer=msg->payload;
+ msg->payload=NULL;
+ sftp_message_free(msg);
+ break;
+ default:
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"unsupported message back %d",msg->packet_type);
+ sftp_message_free(msg);
+ return NULL;
+ }
+ }
+ /* now dir->buffer contains a buffer and dir->count != 0 */
+ if(dir->count==0){
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Count of files sent by the server is zero, which is invalid, or libsftp bug");
+ return NULL;
+ }
+ ssh_say(2,"Count is %d\n",dir->count);
+ attr=sftp_parse_attr(sftp,dir->buffer,1);
+ dir->count--;
+ if(dir->count==0){
+ buffer_free(dir->buffer);
+ dir->buffer=NULL;
+ }
+ return attr;
+}
+
+int sftp_dir_eof(SFTP_DIR *dir){
+ return (dir->eof);
+}
+
+void sftp_attributes_free(SFTP_ATTRIBUTES *file){
+ if(file->name)
+ free(file->name);
+ if(file->longname)
+ free(file->longname);
+ if(file->acl)
+ free(file->acl);
+ if(file->extended_data)
+ free(file->extended_data);
+ if(file->extended_type)
+ free(file->extended_type);
+ if(file->group)
+ free(file->group);
+ if(file->owner)
+ free(file->owner);
+ free(file);
+}
+
+static int sftp_handle_close(SFTP_SESSION *sftp, STRING *handle){
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status;
+ int id=sftp_get_new_id(sftp);
+ int err=0;
+ BUFFER *buffer=buffer_new();
+ buffer_add_u32(buffer,id);
+ buffer_add_ssh_string(buffer,handle);
+ sftp_packet_write(sftp,SSH_FXP_CLOSE,buffer);
+ buffer_free(buffer);
+ while(!msg){
+ if(sftp_read_and_dispatch(sftp))
+ /* something nasty has happened */
+ return -1;
+ msg=sftp_dequeue(sftp,id);
+ }
+ switch (msg->packet_type){
+ case SSH_FXP_STATUS:
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return -1;
+ if(status->status != SSH_FX_OK){
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
+ err=-1;
+ }
+ status_msg_free(status);
+ return err;
+ default:
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received message %d during sftp_handle_close!",msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return -1;
+}
+
+int sftp_file_close(SFTP_FILE *file){
+ int err=0;
+ if(file->name)
+ free(file->name);
+ if(file->handle){
+ err=sftp_handle_close(file->sftp,file->handle);
+ free(file->handle);
+ }
+ free(file);
+ return err;
+}
+
+int sftp_dir_close(SFTP_DIR *dir){
+ int err=0;
+ if(dir->name)
+ free(dir->name);
+ if(dir->handle){
+ err=sftp_handle_close(dir->sftp,dir->handle);
+ free(dir->handle);
+ }
+ if(dir->buffer)
+ buffer_free(dir->buffer);
+ free(dir);
+ return err;
+}
+
+SFTP_FILE *sftp_open(SFTP_SESSION *sftp, char *file, int access, SFTP_ATTRIBUTES *attr){
+ SFTP_FILE *handle;
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status;
+ u32 flags=0;
+ u32 id=sftp_get_new_id(sftp);
+ BUFFER *buffer=buffer_new();
+ STRING *filename;
+ if(access & O_RDONLY)
+ flags|=SSH_FXF_READ;
+ if(access & O_WRONLY)
+ flags |= SSH_FXF_WRITE;
+ if(access & O_RDWR)
+ flags|=(SSH_FXF_WRITE | SSH_FXF_READ);
+ if(access & O_CREAT)
+ flags |=SSH_FXF_CREAT;
+ if(access & O_TRUNC)
+ flags |=SSH_FXF_TRUNC;
+ if(access & O_EXCL)
+ flags |= SSH_FXF_EXCL;
+ buffer_add_u32(buffer,id);
+ filename=string_from_char(file);
+ buffer_add_ssh_string(buffer,filename);
+ free(filename);
+ buffer_add_u32(buffer,htonl(flags));
+ buffer_add_attributes(buffer,attr);
+ sftp_packet_write(sftp,SSH_FXP_OPEN,buffer);
+ buffer_free(buffer);
+ while(!msg){
+ if(sftp_read_and_dispatch(sftp))
+ /* something nasty has happened */
+ return NULL;
+ msg=sftp_dequeue(sftp,id);
+ }
+ switch (msg->packet_type){
+ case SSH_FXP_STATUS:
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return NULL;
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
+ status_msg_free(status);
+ return NULL;
+ case SSH_FXP_HANDLE:
+ handle=parse_handle_msg(msg);
+ sftp_message_free(msg);
+ return handle;
+ default:
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received message %d during open!",msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return NULL;
+}
+
+void sftp_file_set_nonblocking(SFTP_FILE *handle){
+ handle->nonblocking=1;
+}
+void sftp_file_set_blocking(SFTP_FILE *handle){
+ handle->nonblocking=0;
+}
+
+int sftp_read(SFTP_FILE *handle, void *data, int len){
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status;
+ SFTP_SESSION *sftp=handle->sftp;
+ STRING *datastring;
+ int id;
+ int err=0;
+ BUFFER *buffer;
+ if(handle->eof)
+ return 0;
+ buffer=buffer_new();
+ id=sftp_get_new_id(handle->sftp);
+ buffer_add_u32(buffer,id);
+ buffer_add_ssh_string(buffer,handle->handle);
+ buffer_add_u64(buffer,htonll(handle->offset));
+ buffer_add_u32(buffer,htonl(len));
+ sftp_packet_write(handle->sftp,SSH_FXP_READ,buffer);
+ buffer_free(buffer);
+ while(!msg){
+ if (handle->nonblocking){
+ if(channel_poll(handle->sftp->channel,0)==0){
+ /* we cannot block */
+ return 0;
+ }
+ }
+ if(sftp_read_and_dispatch(handle->sftp))
+ /* something nasty has happened */
+ return -1;
+ msg=sftp_dequeue(handle->sftp,id);
+ }
+ switch (msg->packet_type){
+ case SSH_FXP_STATUS:
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return -1;
+ if(status->status != SSH_FX_EOF){
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
+ err=-1;
+ }
+ else
+ handle->eof=1;
+ status_msg_free(status);
+ return err?err:0;
+ case SSH_FXP_DATA:
+ datastring=buffer_get_ssh_string(msg->payload);
+ sftp_message_free(msg);
+ if(!datastring){
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received invalid DATA packet from sftp server");
+ return -1;
+ }
+ if(string_len(datastring)>len){
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received a too big DATA packet from sftp server : %d and asked for %d",
+ string_len(datastring),len);
+ free(datastring);
+ return -1;
+ }
+ len=string_len(datastring);
+ handle->offset+=len;
+ memcpy(data,datastring->string,len);
+ free(datastring);
+ return len;
+ default:
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received message %d during read!",msg->packet_type);
+ sftp_message_free(msg);
+ return -1;
+ }
+ return -1; /* not reached */
+}
+
+int sftp_write(SFTP_FILE *file, void *data, int len){
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status;
+ STRING *datastring;
+ SFTP_SESSION *sftp=file->sftp;
+ int id;
+ int err=0;
+ BUFFER *buffer;
+ buffer=buffer_new();
+ id=sftp_get_new_id(file->sftp);
+ buffer_add_u32(buffer,id);
+ buffer_add_ssh_string(buffer,file->handle);
+ buffer_add_u64(buffer,htonll(file->offset));
+ datastring=string_new(len);
+ string_fill(datastring,data,len);
+ buffer_add_ssh_string(buffer,datastring);
+ free(datastring);
+ if(sftp_packet_write(file->sftp,SSH_FXP_WRITE,buffer) != buffer_get_len(buffer)){
+ ssh_say(1,"sftp_packet_write did not write as much data as expected\n");
+ }
+ buffer_free(buffer);
+ while(!msg){
+ if(sftp_read_and_dispatch(file->sftp))
+ /* something nasty has happened */
+ return -1;
+ msg=sftp_dequeue(file->sftp,id);
+ }
+ switch (msg->packet_type){
+ case SSH_FXP_STATUS:
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return -1;
+ if(status->status != SSH_FX_OK){
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server : %s",status->errormsg);
+ err=-1;
+ }
+ file->offset+=len;
+ status_msg_free(status);
+ return (err?err:len);
+ default:
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received message %d during write!",msg->packet_type);
+ sftp_message_free(msg);
+ return -1;
+ }
+ return -1; /* not reached */
+}
+
+void sftp_seek(SFTP_FILE *file, int new_offset){
+ file->offset=new_offset;
+}
+
+unsigned long sftp_tell(SFTP_FILE *file){
+ return file->offset;
+}
+
+void sftp_rewind(SFTP_FILE *file){
+ file->offset=0;
+}
+
+/* code written by Nick */
+int sftp_rm(SFTP_SESSION *sftp, char *file) {
+ u32 id = sftp_get_new_id(sftp);
+ BUFFER *buffer = buffer_new();
+ STRING *filename = string_from_char(file);
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status = NULL;
+
+ buffer_add_u32(buffer, id);
+ buffer_add_ssh_string(buffer, filename);
+ free(filename);
+ sftp_packet_write(sftp, SSH_FXP_REMOVE, buffer);
+ buffer_free(buffer);
+ while (!msg) {
+ if (sftp_read_and_dispatch(sftp)) {
+ return -1;
+ }
+ msg = sftp_dequeue(sftp, id);
+ }
+ if (msg->packet_type == SSH_FXP_STATUS) {
+ /* by specification, this command's only supposed to return SSH_FXP_STATUS */
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (!status)
+ return -1;
+ if (status->status != SSH_FX_OK) {
+ /* status should be SSH_FX_OK if the command was successful, if it didn't, then there was an error */
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg);
+ status_msg_free(status);
+ return -1;
+ }
+ status_msg_free(status);
+ return 0; /* at this point, everything turned out OK */
+ } else {
+ ssh_set_error(sftp->session,SSH_INVALID_DATA, "Received message %d when attempting to remove file", msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return -1;
+}
+
+/* code written by Nick */
+int sftp_rmdir(SFTP_SESSION *sftp, char *directory) {
+ u32 id = sftp_get_new_id(sftp);
+ BUFFER *buffer = buffer_new();
+ STRING *filename = string_from_char(directory);
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status = NULL;
+
+ buffer_add_u32(buffer, id);
+ buffer_add_ssh_string(buffer, filename);
+ free(filename);
+ sftp_packet_write(sftp, SSH_FXP_RMDIR, buffer);
+ buffer_free(buffer);
+ while (!msg) {
+ if (sftp_read_and_dispatch(sftp))
+ {
+ return -1;
+ }
+ msg = sftp_dequeue(sftp, id);
+ }
+ if (msg->packet_type == SSH_FXP_STATUS) /* by specification, this command's only supposed to return SSH_FXP_STATUS */
+ {
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (!status)
+ {
+ return -1;
+ }
+ else if (status->status != SSH_FX_OK) /* status should be SSH_FX_OK if the command was successful, if it didn't, then there was an error */
+ {
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg);
+ status_msg_free(status);
+ return -1;
+ }
+ status_msg_free(status);
+ return 0; /* at this point, everything turned out OK */
+ }
+ else
+ {
+ ssh_set_error(sftp->session,SSH_INVALID_DATA, "Received message %d when attempting to remove directory", msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return -1;
+}
+
+/* Code written by Nick */
+int sftp_mkdir(SFTP_SESSION *sftp, char *directory, SFTP_ATTRIBUTES *attr) {
+ u32 id = sftp_get_new_id(sftp);
+ BUFFER *buffer = buffer_new();
+ STRING *path = string_from_char(directory);
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status = NULL;
+
+ buffer_add_u32(buffer, id);
+ buffer_add_ssh_string(buffer, path);
+ free(path);
+ buffer_add_attributes(buffer, attr);
+ sftp_packet_write(sftp, SSH_FXP_MKDIR, buffer);
+ buffer_free(buffer);
+ while (!msg) {
+ if (sftp_read_and_dispatch(sftp))
+ return -1;
+ msg = sftp_dequeue(sftp, id);
+ }
+ if (msg->packet_type == SSH_FXP_STATUS) {
+ /* by specification, this command's only supposed to return SSH_FXP_STATUS */
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (!status)
+ return -1;
+ else
+ if (status->status != SSH_FX_OK) {
+ /* status should be SSH_FX_OK if the command was successful, if it didn't, then there was an error */
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg);
+ status_msg_free(status);
+ return -1;
+ }
+ status_msg_free(status);
+ return 0; /* at this point, everything turned out OK */
+ } else {
+ ssh_set_error(sftp->session,SSH_INVALID_DATA, "Received message %d when attempting to make directory", msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return -1;
+}
+
+/* code written by nick */
+int sftp_rename(SFTP_SESSION *sftp, char *original, char *newname) {
+ u32 id = sftp_get_new_id(sftp);
+ BUFFER *buffer = buffer_new();
+ STRING *oldpath = string_from_char(original);
+ STRING *newpath = string_from_char(newname);
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status = NULL;
+
+ buffer_add_u32(buffer, id);
+ buffer_add_ssh_string(buffer, oldpath);
+ free(oldpath);
+ buffer_add_ssh_string(buffer, newpath);
+ free(newpath);
+ sftp_packet_write(sftp, SSH_FXP_RENAME, buffer);
+ buffer_free(buffer);
+ while (!msg) {
+ if (sftp_read_and_dispatch(sftp))
+ return -1;
+ msg = sftp_dequeue(sftp, id);
+ }
+ if (msg->packet_type == SSH_FXP_STATUS) {
+ /* by specification, this command's only supposed to return SSH_FXP_STATUS */
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (!status)
+ return -1;
+ else if (status->status != SSH_FX_OK) {
+ /* status should be SSH_FX_OK if the command was successful, if it didn't, then there was an error */
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg);
+ status_msg_free(status);
+ return -1;
+ }
+ status_msg_free(status);
+ return 0; /* at this point, everything turned out OK */
+ } else {
+ ssh_set_error(sftp->session,SSH_INVALID_DATA, "Received message %d when attempting to rename", msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return -1;
+}
+
+/* Code written by Nick */
+int sftp_setstat(SFTP_SESSION *sftp, char *file, SFTP_ATTRIBUTES *attr) {
+ u32 id = sftp_get_new_id(sftp);
+ BUFFER *buffer = buffer_new();
+ STRING *path = string_from_char(file);
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status = NULL;
+
+ buffer_add_u32(buffer, id);
+ buffer_add_ssh_string(buffer, path);
+ free(path);
+ buffer_add_attributes(buffer, attr);
+ sftp_packet_write(sftp, SSH_FXP_SETSTAT, buffer);
+ buffer_free(buffer);
+ while (!msg) {
+ if (sftp_read_and_dispatch(sftp))
+ return -1;
+ msg = sftp_dequeue(sftp, id);
+ }
+ if (msg->packet_type == SSH_FXP_STATUS) {
+ /* by specification, this command's only supposed to return SSH_FXP_STATUS */
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (!status)
+ return -1;
+ else if (status->status != SSH_FX_OK) {
+ /* status should be SSH_FX_OK if the command was successful, if it didn't, then there was an error */
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg);
+ status_msg_free(status);
+ return -1;
+ }
+ status_msg_free(status);
+ return 0; /* at this point, everything turned out OK */
+ } else {
+ ssh_set_error(sftp->session,SSH_INVALID_DATA, "Received message %d when attempting to set stats", msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return -1;
+}
+
+/* another code written by Nick */
+char *sftp_canonicalize_path(SFTP_SESSION *sftp, char *path)
+{
+ u32 id = sftp_get_new_id(sftp);
+ BUFFER *buffer = buffer_new();
+ STRING *pathstr = string_from_char(path);
+ STRING *name = NULL;
+ SFTP_MESSAGE *msg = NULL;
+ STATUS_MESSAGE *status = NULL;
+ char *cname;
+ u32 ignored;
+
+ buffer_add_u32(buffer, id);
+ buffer_add_ssh_string(buffer, pathstr);
+ free(pathstr);
+ sftp_packet_write(sftp, SSH_FXP_REALPATH, buffer);
+ buffer_free(buffer);
+ while (!msg)
+ {
+ if (sftp_read_and_dispatch(sftp))
+ return NULL;
+ msg = sftp_dequeue(sftp, id);
+ }
+ if (msg->packet_type == SSH_FXP_NAME) /* good response */
+ {
+ buffer_get_u32(msg->payload, &ignored); /* we don't care about "count" */
+ name = buffer_get_ssh_string(msg->payload); /* we only care about the file name string */
+ cname = string_to_char(name);
+ free(name);
+ return cname;
+ }
+ else if (msg->packet_type == SSH_FXP_STATUS) /* bad response (error) */
+ {
+ status = parse_status_msg(msg);
+ sftp_message_free(msg);
+ if (!status)
+ return NULL;
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED, "sftp server: %s", status->errormsg);
+ status_msg_free(status);
+ }
+ else /* this shouldn't happen */
+ {
+ ssh_set_error(sftp->session,SSH_INVALID_DATA, "Received message %d when attempting to set stats", msg->packet_type);
+ sftp_message_free(msg);
+ }
+ return NULL;
+}
+
+SFTP_ATTRIBUTES *sftp_xstat(SFTP_SESSION *sftp, char *path,int param){
+ u32 id=sftp_get_new_id(sftp);
+ BUFFER *buffer=buffer_new();
+ STRING *pathstr= string_from_char(path);
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status=NULL;
+ SFTP_ATTRIBUTES *pattr=NULL;
+
+ buffer_add_u32(buffer,id);
+ buffer_add_ssh_string(buffer,pathstr);
+ free(pathstr);
+ sftp_packet_write(sftp,param,buffer);
+ buffer_free(buffer);
+ while(!msg){
+ if(sftp_read_and_dispatch(sftp))
+ return NULL;
+ msg=sftp_dequeue(sftp,id);
+ }
+ if(msg->packet_type==SSH_FXP_ATTRS){
+ pattr=sftp_parse_attr(sftp,msg->payload,0);
+ return pattr;
+ }
+ if(msg->packet_type== SSH_FXP_STATUS){
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return NULL;
+ ssh_set_error(sftp->session,SSH_REQUEST_DENIED,"sftp server: %s",status->errormsg);
+ status_msg_free(status);
+ return NULL;
+ }
+ ssh_set_error(sftp->session,SSH_INVALID_DATA,"Received mesg %d during stat(),mesg->packet_type");
+ sftp_message_free(msg);
+ return NULL;
+}
+
+SFTP_ATTRIBUTES *sftp_stat(SFTP_SESSION *session, char *path){
+ return sftp_xstat(session,path,SSH_FXP_STAT);
+}
+SFTP_ATTRIBUTES *sftp_lstat(SFTP_SESSION *session, char *path){
+ return sftp_xstat(session,path,SSH_FXP_LSTAT);
+}
+
+SFTP_ATTRIBUTES *sftp_fstat(SFTP_FILE *file) {
+ u32 id=sftp_get_new_id(file->sftp);
+ BUFFER *buffer=buffer_new();
+ SFTP_MESSAGE *msg=NULL;
+ STATUS_MESSAGE *status=NULL;
+ SFTP_ATTRIBUTES *pattr=NULL;
+
+ buffer_add_u32(buffer,id);
+ buffer_add_ssh_string(buffer,file->handle);
+ sftp_packet_write(file->sftp,SSH_FXP_FSTAT,buffer);
+ buffer_free(buffer);
+ while(!msg){
+ if(sftp_read_and_dispatch(file->sftp))
+ return NULL;
+ msg=sftp_dequeue(file->sftp,id);
+ }
+ if(msg->packet_type==SSH_FXP_ATTRS){
+ pattr=sftp_parse_attr(file->sftp,msg->payload,0);
+ return pattr;
+ }
+ if(msg->packet_type== SSH_FXP_STATUS){
+ status=parse_status_msg(msg);
+ sftp_message_free(msg);
+ if(!status)
+ return NULL;
+ ssh_set_error(file->sftp->session,SSH_REQUEST_DENIED,"sftp server: %s",status->errormsg);
+ status_msg_free(status);
+ return NULL;
+ }
+ ssh_set_error(file->sftp->session,SSH_INVALID_DATA,"Received mesg %d during fstat(),mesg->packet_type");
+ sftp_message_free(msg);
+ return NULL;
+}
+
+
+#endif /* NO_SFTP */
diff --git a/kftpgrabber/src/misc/libs/ssh/sftp.h b/kftpgrabber/src/misc/libs/ssh/sftp.h
new file mode 100644
index 0000000..10334ab
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/sftp.h
@@ -0,0 +1,225 @@
+/* sftp headers */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#ifndef SFTP_H
+#define SFTP_H
+#include "libssh.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct sftp_session_struct {
+ SSH_SESSION *session;
+ CHANNEL *channel;
+ int server_version;
+ struct request_queue *queue;
+ u32 id_counter;
+} SFTP_SESSION ;
+
+typedef struct {
+ SFTP_SESSION *sftp;
+ u8 type;
+ BUFFER *payload;
+} SFTP_PACKET;
+
+/* file handler */
+typedef struct sftp_file{
+ SFTP_SESSION *sftp;
+ char *name;
+ u64 offset;
+ STRING *handle;
+ int eof;
+ int nonblocking;
+} SFTP_FILE ;
+
+typedef struct sftp_dir {
+ SFTP_SESSION *sftp;
+ char *name;
+ STRING *handle; /* handle to directory */
+ BUFFER *buffer; /* contains raw attributes from server which haven't been parsed */
+ u32 count; /* counts the number of following attributes structures into buffer */
+ int eof; /* end of directory listing */
+} SFTP_DIR;
+
+typedef struct {
+ SFTP_SESSION *sftp;
+ u8 packet_type;
+ BUFFER *payload;
+ u32 id;
+} SFTP_MESSAGE;
+
+typedef struct request_queue{
+ struct request_queue *next;
+ SFTP_MESSAGE *message;
+} REQUEST_QUEUE;
+
+/* SSH_FXP_MESSAGE described into .7 page 26 */
+typedef struct {
+ u32 id;
+ u32 status;
+ STRING *error;
+ STRING *lang;
+ char *errormsg;
+ char *langmsg;
+} STATUS_MESSAGE;
+
+/* don't worry much of these aren't really used */
+typedef struct {
+ char *name;
+ char *longname; /* some weird stuff */
+ u32 flags;
+ u8 type;
+ u64 size;
+ u32 uid;
+ u32 gid;
+ char *owner;
+ char *group;
+ u32 permissions;
+ u64 atime64;
+ u32 atime;
+ u32 atime_nseconds;
+ u64 createtime;
+ u32 createtime_nseconds;
+ u64 mtime64;
+ u32 mtime;
+ u32 mtime_nseconds;
+ STRING *acl;
+ u32 extended_count;
+ STRING *extended_type;
+ STRING *extended_data;
+} SFTP_ATTRIBUTES;
+
+#define LIBSFTP_VERSION 3
+
+SFTP_SESSION *sftp_new(SSH_SESSION *session);
+void sftp_free(SFTP_SESSION *sftp);
+int sftp_init(SFTP_SESSION *sftp);
+SFTP_DIR *sftp_opendir(SFTP_SESSION *session, char *path);
+/* reads one file and attribute from opened directory. fails at end */
+SFTP_ATTRIBUTES *sftp_readdir(SFTP_SESSION *session, SFTP_DIR *dir);
+/* returns 1 if the directory was EOF */
+int sftp_dir_eof(SFTP_DIR *dir);
+SFTP_ATTRIBUTES *sftp_stat(SFTP_SESSION *session, char *path);
+SFTP_ATTRIBUTES *sftp_lstat(SFTP_SESSION *session, char *path);
+/* sftp_lstat stats a file but doesn't follow symlinks */
+SFTP_ATTRIBUTES *sftp_fstat(SFTP_FILE *file);
+void sftp_attributes_free(SFTP_ATTRIBUTES *file);
+int sftp_dir_close(SFTP_DIR *dir);
+int sftp_file_close(SFTP_FILE *file);
+/* access are the sames than the ones from ansi fopen() */
+SFTP_FILE *sftp_open(SFTP_SESSION *session, char *file, int access, SFTP_ATTRIBUTES *attr);
+int sftp_read(SFTP_FILE *file, void *dest, int len);
+int sftp_write(SFTP_FILE *file, void *source, int len);
+void sftp_seek(SFTP_FILE *file, int new_offset);
+unsigned long sftp_tell(SFTP_FILE *file);
+void sftp_rewind(SFTP_FILE *file);
+int sftp_rm(SFTP_SESSION *sftp, char *file);
+int sftp_rmdir(SFTP_SESSION *sftp, char *directory);
+int sftp_mkdir(SFTP_SESSION *sftp, char *directory, SFTP_ATTRIBUTES *attr);
+int sftp_rename(SFTP_SESSION *sftp, char *original, char *newname);
+int sftp_setstat(SFTP_SESSION *sftp, char *file, SFTP_ATTRIBUTES *attr);
+char *sftp_canonicalize_path(SFTP_SESSION *sftp, char *path);
+
+/* SFTP commands and constants */
+#define SSH_FXP_INIT 1
+#define SSH_FXP_VERSION 2
+#define SSH_FXP_OPEN 3
+#define SSH_FXP_CLOSE 4
+#define SSH_FXP_READ 5
+#define SSH_FXP_WRITE 6
+#define SSH_FXP_LSTAT 7
+#define SSH_FXP_FSTAT 8
+#define SSH_FXP_SETSTAT 9
+#define SSH_FXP_FSETSTAT 10
+#define SSH_FXP_OPENDIR 11
+#define SSH_FXP_READDIR 12
+#define SSH_FXP_REMOVE 13
+#define SSH_FXP_MKDIR 14
+#define SSH_FXP_RMDIR 15
+#define SSH_FXP_REALPATH 16
+#define SSH_FXP_STAT 17
+#define SSH_FXP_RENAME 18
+#define SSH_FXP_READLINK 19
+#define SSH_FXP_SYMLINK 20
+
+#define SSH_FXP_STATUS 101
+#define SSH_FXP_HANDLE 102
+#define SSH_FXP_DATA 103
+#define SSH_FXP_NAME 104
+#define SSH_FXP_ATTRS 105
+
+#define SSH_FXP_EXTENDED 200
+#define SSH_FXP_EXTENDED_REPLY 201
+
+/* attributes */
+/* sftp draft is completely braindead : version 3 and 4 have different flags for same constants */
+/* and even worst, version 4 has same flag for 2 different constants */
+/* follow up : i won't develop any sftp4 compliant library before having a clarification */
+
+#define SSH_FILEXFER_ATTR_SIZE 0x00000001
+#define SSH_FILEXFER_ATTR_PERMISSIONS 0x00000004
+#define SSH_FILEXFER_ATTR_ACCESSTIME 0x00000008
+#define SSH_FILEXFER_ATTR_ACMODTIME 0x00000008
+#define SSH_FILEXFER_ATTR_CREATETIME 0x00000010
+#define SSH_FILEXFER_ATTR_MODIFYTIME 0x00000020
+#define SSH_FILEXFER_ATTR_ACL 0x00000040
+#define SSH_FILEXFER_ATTR_OWNERGROUP 0x00000080
+#define SSH_FILEXFER_ATTR_SUBSECOND_TIMES 0x00000100
+#define SSH_FILEXFER_ATTR_EXTENDED 0x80000000
+#define SSH_FILEXFER_ATTR_UIDGID 0x00000002
+
+/* types */
+#define SSH_FILEXFER_TYPE_REGULAR 1
+#define SSH_FILEXFER_TYPE_DIRECTORY 2
+#define SSH_FILEXFER_TYPE_SYMLINK 3
+#define SSH_FILEXFER_TYPE_SPECIAL 4
+#define SSH_FILEXFER_TYPE_UNKNOWN 5
+
+/* server responses */
+#define SSH_FX_OK 0
+#define SSH_FX_EOF 1
+#define SSH_FX_NO_SUCH_FILE 2
+#define SSH_FX_PERMISSION_DENIED 3
+#define SSH_FX_FAILURE 4
+#define SSH_FX_BAD_MESSAGE 5
+#define SSH_FX_NO_CONNECTION 6
+#define SSH_FX_CONNECTION_LOST 7
+#define SSH_FX_OP_UNSUPPORTED 8
+#define SSH_FX_INVALID_HANDLE 9
+#define SSH_FX_NO_SUCH_PATH 10
+#define SSH_FX_FILE_ALREADY_EXISTS 11
+#define SSH_FX_WRITE_PROTECT 12
+#define SSH_FX_NO_MEDIA 13
+
+/* file flags */
+#define SSH_FXF_READ 0x01
+#define SSH_FXF_WRITE 0x02
+#define SSH_FXF_APPEND 0x04
+#define SSH_FXF_CREAT 0x08
+#define SSH_FXF_TRUNC 0x10
+#define SSH_FXF_EXCL 0x20
+#define SSH_FXF_TEXT 0x40
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SFTP_H */
diff --git a/kftpgrabber/src/misc/libs/ssh/ssh2.h b/kftpgrabber/src/misc/libs/ssh/ssh2.h
new file mode 100644
index 0000000..e6dc04f
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/ssh2.h
@@ -0,0 +1,69 @@
+#ifndef __SSH2_H
+#define __SSH2_H
+
+#define SSH2_MSG_DISCONNECT 1
+#define SSH2_MSG_IGNORE 2
+#define SSH2_MSG_UNIMPLEMENTED 3
+#define SSH2_MSG_DEBUG 4
+#define SSH2_MSG_SERVICE_REQUEST 5
+#define SSH2_MSG_SERVICE_ACCEPT 6
+
+#define SSH2_MSG_KEXINIT 20
+#define SSH2_MSG_NEWKEYS 21
+
+#define SSH2_MSG_KEXDH_INIT 30
+#define SSH2_MSG_KEXDH_REPLY 31
+
+#define SSH2_MSG_KEX_DH_GEX_REQUEST_OLD 30
+#define SSH2_MSG_KEX_DH_GEX_GROUP 31
+#define SSH2_MSG_KEX_DH_GEX_INIT 32
+#define SSH2_MSG_KEX_DH_GEX_REPLY 33
+#define SSH2_MSG_KEX_DH_GEX_REQUEST 34
+#define SSH2_MSG_USERAUTH_REQUEST 50
+#define SSH2_MSG_USERAUTH_FAILURE 51
+#define SSH2_MSG_USERAUTH_SUCCESS 52
+#define SSH2_MSG_USERAUTH_BANNER 53
+#define SSH2_MSG_USERAUTH_PK_OK 60
+#define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60
+#define SSH2_MSG_USERAUTH_INFO_REQUEST 60
+#define SSH2_MSG_USERAUTH_INFO_RESPONSE 61
+#define SSH2_MSG_GLOBAL_REQUEST 80
+#define SSH2_MSG_REQUEST_SUCCESS 81
+#define SSH2_MSG_REQUEST_FAILURE 82
+#define SSH2_MSG_CHANNEL_OPEN 90
+#define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91
+#define SSH2_MSG_CHANNEL_OPEN_FAILURE 92
+#define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93
+#define SSH2_MSG_CHANNEL_DATA 94
+#define SSH2_MSG_CHANNEL_EXTENDED_DATA 95
+#define SSH2_MSG_CHANNEL_EOF 96
+#define SSH2_MSG_CHANNEL_CLOSE 97
+#define SSH2_MSG_CHANNEL_REQUEST 98
+#define SSH2_MSG_CHANNEL_SUCCESS 99
+#define SSH2_MSG_CHANNEL_FAILURE 100
+
+#define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1
+#define SSH2_DISCONNECT_PROTOCOL_ERROR 2
+#define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3
+#define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4
+#define SSH2_DISCONNECT_RESERVED 4
+#define SSH2_DISCONNECT_MAC_ERROR 5
+#define SSH2_DISCONNECT_COMPRESSION_ERROR 6
+#define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7
+#define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8
+#define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9
+#define SSH2_DISCONNECT_CONNECTION_LOST 10
+#define SSH2_DISCONNECT_BY_APPLICATION 11
+#define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12
+#define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13
+#define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14
+#define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15
+
+#define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED 1
+#define SSH2_OPEN_CONNECT_FAILED 2
+#define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE 3
+#define SSH2_OPEN_RESOURCE_SHORTAGE 4
+
+#define SSH2_EXTENDED_DATA_STDERR 1
+
+#endif
diff --git a/kftpgrabber/src/misc/libs/ssh/string.c b/kftpgrabber/src/misc/libs/ssh/string.c
new file mode 100644
index 0000000..1126e7a
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/string.c
@@ -0,0 +1,65 @@
+/*string.c */
+/* string manipulations... */
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include <stdlib.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <string.h>
+#include "priv.h"
+
+STRING *string_new(u32 size){
+ STRING *str=malloc(size + 4);
+ str->size=htonl(size);
+ return str;
+}
+
+void string_fill(STRING *str,void *data,int len){
+ memcpy(str->string,data,len);
+}
+
+STRING *string_from_char(char *what){
+ STRING *ptr;
+ int len=strlen(what);
+ ptr=malloc(4 + len);
+ ptr->size=htonl(len);
+ memcpy(ptr->string,what,len);
+ return ptr;
+}
+
+int string_len(STRING *str){
+ return ntohl(str->size);
+}
+
+char *string_to_char(STRING *str){
+ int len=ntohl(str->size)+1;
+ char *string=malloc(len);
+ memcpy(string,str->string,len-1);
+ string[len-1]=0;
+ return string;
+}
+
+STRING *string_copy(STRING *str){
+ STRING *ret=malloc(ntohl(str->size)+4);
+ ret->size=str->size;
+ memcpy(ret->string,str->string,ntohl(str->size));
+ return ret;
+}
diff --git a/kftpgrabber/src/misc/libs/ssh/wrapper.c b/kftpgrabber/src/misc/libs/ssh/wrapper.c
new file mode 100644
index 0000000..b99beeb
--- /dev/null
+++ b/kftpgrabber/src/misc/libs/ssh/wrapper.c
@@ -0,0 +1,241 @@
+/* wrapper.c */
+/* wrapping functions for crypto functions. */
+/* why a wrapper ? let's say you want to port libssh from libcrypto of openssl to libfoo */
+/* you are going to spend hours to remove every references to SHA1_Update() to libfoo_sha1_update */
+/* after the work is finished, you're going to have only this file to modify */
+/* it's not needed to say that your modifications are welcome */
+
+/*
+Copyright 2003 Aris Adamantiadis
+
+This file is part of the SSH Library
+
+The SSH Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
+option) any later version.
+
+The SSH 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 Lesser General Public
+License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with the SSH Library; see the file COPYING. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+MA 02110-1301, USA. */
+
+#include "priv.h"
+#include "crypto.h"
+#include <string.h>
+#ifdef OPENSSL_CRYPTO
+#include <openssl/sha.h>
+#include <openssl/md5.h>
+#include <openssl/dsa.h>
+#include <openssl/rsa.h>
+#include <openssl/hmac.h>
+#include <openssl/opensslv.h>
+#ifdef HAVE_OPENSSL_AES_H
+#define HAS_AES
+#include <openssl/aes.h>
+#endif
+#ifdef HAVE_OPENSSL_BLOWFISH_H
+#define HAS_BLOWFISH
+#include <openssl/blowfish.h>
+#endif
+#if (OPENSSL_VERSION_NUMBER<0x009070000)
+#define OLD_CRYPTO
+#endif
+
+SHACTX *sha1_init(){
+ SHACTX *c=malloc(sizeof(SHACTX));
+ SHA1_Init(c);
+ return c;
+}
+void sha1_update(SHACTX *c, const void *data, unsigned long len){
+ SHA1_Update(c,data,len);
+}
+void sha1_final(unsigned char *md,SHACTX *c){
+ SHA1_Final(md,c);
+ free(c);
+}
+void sha1(unsigned char *digest,int len,unsigned char *hash){
+ SHA1(digest,len,hash);
+}
+
+MD5CTX *md5_init(){
+ MD5CTX *c=malloc(sizeof(MD5CTX));
+ MD5_Init(c);
+ return c;
+}
+void md5_update(MD5CTX *c, const void *data, unsigned long len){
+ MD5_Update(c,data,len);
+}
+void md5_final(unsigned char *md,MD5CTX *c){
+ MD5_Final(md,c);
+ free(c);
+}
+
+HMACCTX *hmac_init(const void *key, int len,int type){
+ HMAC_CTX *ctx;
+ ctx=malloc(sizeof(HMAC_CTX));
+#ifndef OLD_CRYPTO
+ HMAC_CTX_init(ctx); // openssl 0.9.7 requires it.
+#endif
+ switch(type){
+ case HMAC_SHA1:
+ HMAC_Init(ctx,key,len,EVP_sha1());
+ break;
+ case HMAC_MD5:
+ HMAC_Init(ctx,key,len,EVP_md5());
+ break;
+ default:
+ free(ctx);
+ ctx=NULL;
+ }
+ return ctx;
+}
+void hmac_update(HMACCTX *ctx,const void *data, unsigned long len){
+ HMAC_Update(ctx,data,len);
+}
+void hmac_final(HMACCTX *ctx,unsigned char *hashmacbuf,int *len){
+ HMAC_Final(ctx,hashmacbuf,len);
+#ifndef OLD_CRYPTO
+ HMAC_CTX_cleanup(ctx);
+#else
+ HMAC_cleanup(ctx);
+#endif
+ free(ctx);
+}
+
+static void alloc_key(struct crypto_struct *cipher){
+ cipher->key=malloc(cipher->keylen);
+}
+
+#ifdef HAS_BLOWFISH
+/* the wrapper functions for blowfish */
+static void blowfish_set_key(struct crypto_struct *cipher, void *key){
+ if(!cipher->key){
+ alloc_key(cipher);
+ BF_set_key(cipher->key,16,key);
+ }
+}
+
+static void blowfish_encrypt(struct crypto_struct *cipher, void *in, void *out,unsigned long len,void *IV){
+ BF_cbc_encrypt(in,out,len,cipher->key,IV,BF_ENCRYPT);
+}
+
+static void blowfish_decrypt(struct crypto_struct *cipher, void *in, void *out,unsigned long len,void *IV){
+ BF_cbc_encrypt(in,out,len,cipher->key,IV,BF_DECRYPT);
+}
+#endif
+#ifdef HAS_AES
+static void aes_set_encrypt_key(struct crypto_struct *cipher, void *key){
+ if(!cipher->key){
+ alloc_key(cipher);
+ AES_set_encrypt_key(key,cipher->keysize,cipher->key);
+ }
+}
+static void aes_set_decrypt_key(struct crypto_struct *cipher, void *key){
+ if(!cipher->key){
+ alloc_key(cipher);
+ AES_set_decrypt_key(key,cipher->keysize,cipher->key);
+ }
+}
+static void aes_encrypt(struct crypto_struct *cipher, void *in, void *out, unsigned long len, void *IV){
+ AES_cbc_encrypt(in,out,len,cipher->key,IV,AES_ENCRYPT);
+}
+static void aes_decrypt(struct crypto_struct *cipher, void *in, void *out, unsigned long len, void *IV){
+ AES_cbc_encrypt(in,out,len,cipher->key,IV,AES_DECRYPT);
+}
+#endif
+/* the table of supported ciphers */
+static struct crypto_struct ssh_ciphertab[]={
+#ifdef HAS_BLOWFISH
+ { "blowfish-cbc", 8 ,sizeof (BF_KEY),NULL,128,blowfish_set_key,blowfish_set_key,blowfish_encrypt, blowfish_decrypt},
+#endif
+#ifdef HAS_AES
+ { "aes128-cbc",16,sizeof(AES_KEY),NULL,128,aes_set_encrypt_key,aes_set_decrypt_key,aes_encrypt,aes_decrypt},
+ { "aes192-cbc",16,sizeof(AES_KEY),NULL,192,aes_set_encrypt_key,aes_set_decrypt_key,aes_encrypt,aes_decrypt},
+ { "aes256-cbc",16,sizeof(AES_KEY),NULL,256,aes_set_encrypt_key,aes_set_decrypt_key,aes_encrypt,aes_decrypt},
+#endif
+ { NULL,0,0,NULL,0,NULL,NULL,NULL}
+};
+#endif /* OPENSSL_CRYPTO */
+
+/* it allocates a new cipher structure based on its offset into the global table */
+struct crypto_struct *cipher_new(int offset){
+ struct crypto_struct *cipher=malloc(sizeof(struct crypto_struct));
+ /* note the memcpy will copy the pointers : so, you shouldn't free them */
+ memcpy(cipher,&ssh_ciphertab[offset],sizeof(*cipher));
+ return cipher;
+}
+
+void cipher_free(struct crypto_struct *cipher){
+ if(cipher->key){
+ /* destroy the key */
+ memset(cipher->key,0,cipher->keylen);
+ free(cipher->key);
+ }
+ free(cipher);
+}
+
+CRYPTO *crypto_new(){
+ CRYPTO *crypto=malloc(sizeof (CRYPTO));
+ memset(crypto,0,sizeof(*crypto));
+ return crypto;
+}
+
+void crypto_free(CRYPTO *crypto){
+ if(crypto->server_pubkey)
+ free(crypto->server_pubkey);
+ if(crypto->in_cipher)
+ cipher_free(crypto->in_cipher);
+ if(crypto->out_cipher)
+ cipher_free(crypto->out_cipher);
+ if(crypto->e)
+ bignum_free(crypto->e);
+ if(crypto->f)
+ bignum_free(crypto->f);
+ if(crypto->x)
+ bignum_free(crypto->x);
+ if(crypto->k)
+ bignum_free(crypto->k);
+ /* lot of other things */
+ /* i'm lost in my own code. good work */
+ memset(crypto,0,sizeof(*crypto));
+ free(crypto);
+}
+
+int crypt_set_algorithms(SSH_SESSION *session){
+ /* we must scan the kex entries to find crypto algorithms and set their appropriate structure */
+ int i=0;
+ /* out */
+ char *wanted=session->client_kex.methods[KEX_CRYPT_C_S];
+ while(ssh_ciphertab[i].name && strcmp(wanted,ssh_ciphertab[i].name))
+ i++;
+ if(!ssh_ciphertab[i].name){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Crypt_set_algorithms : no crypto algorithm function found for %s",wanted);
+ return -1;
+ }
+ ssh_say(2,"Set output algorithm %s\n",wanted);
+ session->next_crypto->out_cipher=cipher_new(i);
+ i=0;
+ /* in */
+ wanted=session->client_kex.methods[KEX_CRYPT_S_C];
+ while(ssh_ciphertab[i].name && strcmp(wanted,ssh_ciphertab[i].name))
+ i++;
+ if(!ssh_ciphertab[i].name){
+ ssh_set_error((session->connected?session:NULL),SSH_FATAL,"Crypt_set_algorithms : no crypto algorithm function found for %s",wanted);
+ return -1;
+ }
+ ssh_say(2,"Set input algorithm %s\n",wanted);
+ session->next_crypto->in_cipher=cipher_new(i);
+
+ /* compression */
+ if(strstr(session->client_kex.methods[KEX_COMP_C_S],"zlib"))
+ session->next_crypto->do_compress_out=1;
+ if(strstr(session->client_kex.methods[KEX_COMP_S_C],"zlib"))
+ session->next_crypto->do_compress_in=1;
+ return 0;
+}
diff --git a/kftpgrabber/src/misc/misc.cpp b/kftpgrabber/src/misc/misc.cpp
new file mode 100644
index 0000000..c4e3bfa
--- /dev/null
+++ b/kftpgrabber/src/misc/misc.cpp
@@ -0,0 +1,193 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "misc.h"
+
+#include <kurl.h>
+#include <kmdcodec.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kconfig.h>
+
+#include <qcolor.h>
+#include <qpixmapcache.h>
+
+#include <X11/Xlib.h>
+
+namespace KFTPGrabberBase {
+
+QPixmap loadPanelPixmap(const QString &name)
+{
+ return KGlobal::iconLoader()->loadIcon(name, KIcon::Panel, 0, true);
+}
+
+QIconSet loadToolbarIcon(const QString &name, int state)
+{
+ return KGlobal::iconLoader()->loadIconSet(name, KIcon::Toolbar,0,state);
+}
+
+QIconSet loadSmallIcon(const QString &name, int state)
+{
+ return KGlobal::iconLoader()->loadIconSet(name, KIcon::Small,0,state);
+}
+
+QPixmap loadToolbarPixmap(const QString &name)
+{
+ return KGlobal::iconLoader()->loadIcon(name, KIcon::Toolbar,0, true);
+}
+
+QPixmap loadSmallPixmap(const QString &name)
+{
+ return KGlobal::iconLoader()->loadIcon(name, KIcon::Small,0, true);
+}
+
+QPixmap createColorPixmap(QString color)
+{
+ QPixmap tmp(28, 12);
+ tmp.fill(QColor(color));
+
+ QPixmap pixmap(32, 16);
+ pixmap.fill(QColor(0, 0, 0));
+
+ copyBlt(&pixmap, 2, 2, &tmp, 0, 0, 28, 12);
+
+ return pixmap;
+}
+
+QString getStoreDir(const QString &filename)
+{
+ return locateLocal("appdata", filename);
+}
+
+QPixmap createProgressPixmap(int progress, int current)
+{
+ if (progress > 100)
+ progress = 100;
+
+ if (current > 100)
+ current = 100;
+
+ QPixmap pixmap;
+ QString key = QString("%1:%2").arg(progress).arg(current);
+
+ if(!QPixmapCache::find(key, pixmap)) {
+ QPixmap tmp(100, 16);
+ tmp.fill(QColor(237, 237, 237));
+
+ if (progress > 0) {
+ QPixmap p_pix(progress, 16);
+ p_pix.fill(QColor(0, 115, 255));
+
+ QPixmap c_pix(current, 16);
+ c_pix.fill(QColor(0, 88, 192));
+
+ copyBlt(&tmp, 0, 0, &p_pix, 0, 0, progress, 16);
+ copyBlt(&tmp, 0, 0, &c_pix, 0, 0, current, 16);
+ }
+
+ QPixmapCache::insert(key, tmp);
+ return tmp;
+ }
+
+ return pixmap;
+}
+
+bool isModifierKeysPressed(unsigned int mask)
+{
+ Window root;
+ Window child;
+ int root_x, root_y, win_x, win_y;
+ unsigned int keybstate;
+ XQueryPointer(qt_xdisplay(), qt_xrootwin(), &root, &child, &root_x, &root_y, &win_x, &win_y, &keybstate);
+
+ return keybstate & mask;
+}
+
+QString appendPath(const QString &path, const QString &what)
+{
+ if (path.right(1) == "/")
+ return path + what;
+ else
+ return path + "/" + what;
+}
+
+QString path2Name(const QString &path)
+{
+ // Convert full path to filename
+ return (path == "/") ? QString("/") : path.mid(path.findRev('/')+1);
+}
+
+QString path2Dir(const QString &path)
+{
+ // Convert full path to path
+ return path.mid(0, path.findRev('/'));
+}
+
+QString genID()
+{
+ return kapp->randomString(5);
+}
+
+QString encodePassword(const QString& password)
+{
+ return KCodecs::base64Encode(password.ascii(), true).data();
+}
+
+QString decodePassword(const QString& password)
+{
+ return KCodecs::base64Decode(password.ascii()).data();
+}
+
+KConfig *config(const QString &section)
+{
+ KConfig *conf = kapp->config();
+ conf->setGroup(section);
+
+ return conf;
+}
+
+KURL remoteUrl(const QString &path, KURL url)
+{
+ if (path.isEmpty())
+ return KURL();
+
+ KURL tmp = url;
+ tmp.setPath(path);
+
+ return tmp;
+}
+
+} // end namespace
+
diff --git a/kftpgrabber/src/misc/misc.h b/kftpgrabber/src/misc/misc.h
new file mode 100644
index 0000000..654804c
--- /dev/null
+++ b/kftpgrabber/src/misc/misc.h
@@ -0,0 +1,74 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef MISC_H
+#define MISC_H
+
+#include <qiconset.h>
+#include <qptrlist.h>
+
+#include <kiconloader.h>
+
+class KURL;
+class KConfig;
+
+namespace KFTPGrabberBase {
+ // Icon loading stuff
+ QPixmap loadPanelPixmap(const QString &name);
+ QIconSet loadToolbarIcon(const QString &name, int state = 0);
+ QIconSet loadSmallIcon(const QString &name, int state = 0);
+ QPixmap loadToolbarPixmap(const QString &name);
+ QPixmap loadSmallPixmap(const QString &name);
+
+ // Other stuff
+ QPixmap createColorPixmap(QString color);
+ QPixmap createProgressPixmap(int progress, int current = 0);
+ QString appendPath(const QString &path, const QString &what);
+ QString path2Name(const QString &path);
+ QString path2Dir(const QString &path);
+ bool isModifierKeysPressed(unsigned int mask);
+ QString genID();
+ QString getStoreDir(const QString &filename = 0);
+
+ KConfig *config(const QString &section);
+ KURL remoteUrl(const QString &path, KURL url);
+
+ // For "safer" password storage
+ QString encodePassword(const QString& password);
+ QString decodePassword(const QString& password);
+}
+
+#endif
+
diff --git a/kftpgrabber/src/misc/plugins/Makefile.am b/kftpgrabber/src/misc/plugins/Makefile.am
new file mode 100644
index 0000000..0a48ec2
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/Makefile.am
@@ -0,0 +1,3 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+SUBDIRS = bookmarkimport
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/Makefile.am b/kftpgrabber/src/misc/plugins/bookmarkimport/Makefile.am
new file mode 100644
index 0000000..54d0366
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/Makefile.am
@@ -0,0 +1,3 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+SUBDIRS = gftp ncftp kftp filezilla3
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/Makefile.am b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/Makefile.am
new file mode 100644
index 0000000..737df95
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(srcdir)/../../../interfaces \
+ $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kftpimportplugin_filezilla3.la
+kftpimportplugin_filezilla3_la_SOURCES = kftpimportfz3plugin.cpp
+kftpimportplugin_filezilla3_la_LIBADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KPARTS) ../../../interfaces/libkftpinterfaces.la
+kftpimportplugin_filezilla3_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+kde_services_DATA = kftpimportplugin_filezilla3.desktop
+noinst_HEADERS = kftpimportfz3plugin.h
+
+pluginsdir = $(kde_datadir)/kftpimportplugin_filezilla3
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp
new file mode 100644
index 0000000..0928c79
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp
@@ -0,0 +1,166 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpimportfz3plugin.h"
+
+#include <qdir.h>
+#include <qfile.h>
+
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmdcodec.h>
+
+K_EXPORT_COMPONENT_FACTORY(kftpimportplugin_filezilla3,
+ KGenericFactory<KFTPImportFz3Plugin>("kftpimportplugin_filezilla3"))
+
+KFTPImportFz3Plugin::KFTPImportFz3Plugin(QObject *parent, const char *name, const QStringList&)
+ : KFTPBookmarkImportPlugin(parent, name)
+{
+ KGlobal::locale()->insertCatalogue("kftpgrabber");
+}
+
+QDomDocument KFTPImportFz3Plugin::getImportedXml()
+{
+ return m_domDocument;
+}
+
+void KFTPImportFz3Plugin::import(const QString &fileName)
+{
+ m_domDocument.setContent(QString("<category name=\"%1\"/>").arg(i18n("FileZilla 3 import")));
+
+ QFile file(fileName);
+ if (!file.open(IO_ReadOnly)) {
+ emit progress(100);
+ return;
+ }
+
+ m_workDocument.setContent(&file);
+ file.close();
+
+ // Import categories recursively
+ importCategory(m_domDocument.documentElement(), m_workDocument.documentElement().firstChild());
+
+ emit progress(100);
+}
+
+void KFTPImportFz3Plugin::importCategory(QDomNode parent, const QDomNode &node)
+{
+ QDomNode n = node.firstChild();
+
+ while (!n.isNull()) {
+ if (!n.isElement()) {
+ n = n.nextSibling();
+ continue;
+ }
+
+ QDomElement e = n.toElement();
+
+ if (e.tagName() == "Folder") {
+ QDomElement categoryElement = m_domDocument.createElement("category");
+ categoryElement.setAttribute("name", e.firstChild().nodeValue().stripWhiteSpace());
+ parent.appendChild(categoryElement);
+
+ importCategory(categoryElement, n);
+ } else if (e.tagName() == "Server") {
+ QString name = e.lastChild().nodeValue().stripWhiteSpace();
+ QString host = e.namedItem("Host").toElement().text();
+ QString port = e.namedItem("Port").toElement().text();
+ QString localDir = e.namedItem("LocalDir").toElement().text();
+ QString remoteDir = e.namedItem("RemoteDir").toElement().text();
+ QString username = e.namedItem("User").toElement().text();
+ QString password = e.namedItem("Pass").toElement().text();
+
+ // Set name
+ QDomElement siteElement = m_domDocument.createElement("server");
+ siteElement.setAttribute("name", name);
+ parent.appendChild(siteElement);
+
+ // Set host
+ QDomElement tmpElement = m_domDocument.createElement("host");
+ QDomText txtNode = m_domDocument.createTextNode(host);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set port
+ tmpElement = m_domDocument.createElement("port");
+ txtNode = m_domDocument.createTextNode(port);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set remote directory
+ tmpElement = m_domDocument.createElement("defremotepath");
+ txtNode = m_domDocument.createTextNode(remoteDir);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set local directory
+ tmpElement = m_domDocument.createElement("deflocalpath");
+ txtNode = m_domDocument.createTextNode(localDir);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set username
+ if (username.isNull()) {
+ username = "anonymous";
+
+ tmpElement = m_domDocument.createElement("anonlogin");
+ txtNode = m_domDocument.createTextNode("1");
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+ }
+
+ tmpElement = m_domDocument.createElement("username");
+ txtNode = m_domDocument.createTextNode(username);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set password
+ tmpElement = m_domDocument.createElement("password");
+ txtNode = m_domDocument.createTextNode(KCodecs::base64Encode(password.ascii(), true).data());
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+QString KFTPImportFz3Plugin::getDefaultPath()
+{
+ return QString(".filezilla/sitemanager.xml");
+}
+
+#include "kftpimportfz3plugin.moc"
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.h b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.h
new file mode 100644
index 0000000..c340ef5
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.h
@@ -0,0 +1,82 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPIMPORTFZ3PLUGIN_H
+#define KFTPIMPORTFZ3PLUGIN_H
+
+#include <qdom.h>
+#include <kftpbookmarkimportplugin.h>
+
+/**
+ * This plugin enables importing of FileZilla 3 bookmark files into KFTPGrabber.
+ *
+ * @author Jernej Kos
+ */
+class KFTPImportFz3Plugin : public KFTPBookmarkImportPlugin
+{
+Q_OBJECT
+public:
+ KFTPImportFz3Plugin(QObject *parent, const char *name, const QStringList&);
+
+ /**
+ * This method should return the properly formated XML for KFTPGrabber
+ * bookmarks that is generated from the import.
+ *
+ * @return The @ref QDomDocument representation of XML
+ */
+ QDomDocument getImportedXml();
+
+ /**
+ * This method should start the import procedure.
+ *
+ * @param fileName is the path to the file that will be imported
+ */
+ void import(const QString &fileName);
+
+ /**
+ * This method should return the default path where the bookmarks could
+ * be located. The path must be relative to the user's home directory.
+ *
+ * @return The default path where bookmarks are located
+ */
+ QString getDefaultPath();
+private:
+ QDomDocument m_domDocument;
+ QDomDocument m_workDocument;
+
+ void importCategory(QDomNode parent, const QDomNode &node);
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportplugin_filezilla3.desktop b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportplugin_filezilla3.desktop
new file mode 100644
index 0000000..f3b91ae
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/filezilla3/kftpimportplugin_filezilla3.desktop
@@ -0,0 +1,38 @@
+[Desktop Entry]
+Name=FileZilla 3 Import plugin
+Name[ar]=قابس الإستيراد FileZilla 3
+Name[bg]=Приставка за импортиране на FileZilla 3
+Name[da]=Import-plugin
+Name[de]=FileZilla3-Importmodul
+Name[el]=Πρόσθετο εισαγωγής FileZilla 3
+Name[es]=Complemento de importación de FileZilla 3
+Name[et]=FileZilla 3 impordiplugin
+Name[ga]=Breiseán Iompórtála FileZilla 3
+Name[it]=Plugin di importazione FileZilla 3
+Name[ja]=FileZilla 3 インポートプラグイン
+Name[nl]=FileZilla 3-importplugin
+Name[pt]='Plugin' de Importação do FileZilla 3
+Name[pt_BR]=Plug-in de importação do FileZilla 3
+Name[sv]=FileZilla 3-importinsticksprogram
+Name[uk]=Втулок імпорту FileZilla 3
+Name[zh_CN]=FileZilla 3 导入插件
+Comment=FileZilla 3 bookmarks import plugin
+Comment[ar]=قابس FileZilla 3 لإستيراد علامات المواقع
+Comment[bg]=Приставка за импортиране на FileZilla 3 отметки в KFTPGrabber
+Comment[da]=Filezilla 3 bogmærkeimport-plugin
+Comment[de]=FileZilla3-Lesezeichenimportmodul
+Comment[el]=Πρόσθετο εισαγωγής σελιδοδεικτών FileZilla 3
+Comment[es]=Complemento de importación de marcadores de FileZilla 3
+Comment[et]=FileZilla 3 järjehoidjate impordiplugin
+Comment[ga]=Breiseán iompórtála leabharmharcanna FileZilla 3
+Comment[it]=Plugin di importazione dei segnalibri di FileZilla 3
+Comment[ja]=FileZilla 3 ブックマークをインポートするプラグイン
+Comment[nl]=FileZilla 3-bladwijzers importplugin
+Comment[pt]='Plugin' de importação de favoritos do FileZilla 3
+Comment[pt_BR]=Plug-in de importação de favoritos do FileZilla 3
+Comment[sv]=Insticksprogram för FileZilla 3-bokmärkesimport
+Comment[uk]=Втулок імпортування закладок FileZilla 3
+ServiceTypes=KFTPGrabber/BookmarkImportPlugin
+Type=Service
+X-KDE-Library=kftpimportplugin_filezilla3
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/Makefile.am b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/Makefile.am
new file mode 100644
index 0000000..15a7928
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(srcdir)/../../../interfaces \
+ $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kftpimportplugin_gftp.la
+kftpimportplugin_gftp_la_SOURCES = kftpimportgftpplugin.cpp
+kftpimportplugin_gftp_la_LIBADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KPARTS) ../../../interfaces/libkftpinterfaces.la
+kftpimportplugin_gftp_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+kde_services_DATA = kftpimportplugin_gftp.desktop
+noinst_HEADERS = kftpimportgftpplugin.h
+
+pluginsdir = $(kde_datadir)/kftpimportplugin_gftp
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp
new file mode 100644
index 0000000..9bd5e56
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp
@@ -0,0 +1,236 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpimportgftpplugin.h"
+
+#include <qdir.h>
+
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmdcodec.h>
+
+K_EXPORT_COMPONENT_FACTORY(kftpimportplugin_gftp,
+ KGenericFactory<KFTPImportGftpPlugin>("kftpimportplugin_gftp"))
+
+KFTPImportGftpPlugin::KFTPImportGftpPlugin(QObject *parent, const char *name, const QStringList&)
+ : KFTPBookmarkImportPlugin(parent, name)
+{
+ KGlobal::locale()->insertCatalogue("kftpgrabber");
+ m_domDocument.setContent(QString("<category name=\"%1\"/>").arg(i18n("gFTP import")));
+}
+
+QDomDocument KFTPImportGftpPlugin::getImportedXml()
+{
+ return m_domDocument;
+}
+
+void KFTPImportGftpPlugin::import(const QString &fileName)
+{
+ // First we fetch some global settings
+ KConfig tmpConfig(userPath(".gftp/gftprc"), true, false, "HOME");
+ QString email = tmpConfig.readEntry("email", "anonymous@");
+ int numRetries = tmpConfig.readNumEntry("retries", -1);
+ int sleepTime = tmpConfig.readNumEntry("sleep_time", -1);
+
+ // Open the bookmarks file (it has INI-like file format, so we can use the KConfig
+ // class to do the parsing and converting)
+ KConfig config(fileName, true, false, "HOME");
+ QStringList groupList = config.groupList();
+
+ float size = (float) groupList.count();
+ if (size == 0) {
+ // There are no bookmarks (or incorrect file), we are done
+
+ emit progress(100);
+ return;
+ }
+
+ int counter = 0;
+ QStringList::Iterator end( groupList.end() );
+ for( QStringList::Iterator it( groupList.begin() ); it != end; ++it ) {
+ // gFTP bookmarks can have subgroups
+ QString groupName = *it;
+ QStringList groupNames = QStringList::split("/", groupName);
+
+ QDomNode groupNode;
+ QDomElement parentElement = m_domDocument.documentElement();
+ config.setGroup(groupName);
+ QString tmp = config.readEntry("hostname");
+
+ for (unsigned int i = 0; ! tmp.isNull() && i < groupNames.count() - 1; ++i ) {
+ // First see if parenElement has any sub group
+ groupNode = findSubGroup(parentElement, groupNames[i]);
+
+ if( groupNode.isNull() ) {
+ // No, it has no subgroup, let's create one
+ while (i < groupNames.count() -1) {
+ QDomElement tmpElement = m_domDocument.createElement("category");
+ tmpElement.setAttribute("name", groupNames[i]);
+ parentElement.appendChild(tmpElement);
+ parentElement = tmpElement;
+
+ ++i;
+ }
+ } else {
+ // Sub group found, lets check next level
+ parentElement = groupNode.toElement();
+ }
+ }
+
+ // Now group tree is updated so lets create the site (if it has hostname)
+ if (!tmp.isNull()) {
+ // Set name
+ QDomElement siteElement = m_domDocument.createElement("server");
+ siteElement.setAttribute("name", groupNames.last());
+ parentElement.appendChild(siteElement);
+
+ // Set host
+ tmp = config.readEntry("hostname");
+ QDomElement tmpElement = m_domDocument.createElement("host");
+ QDomText txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set port
+ int p = config.readNumEntry("port", 21);
+ tmpElement = m_domDocument.createElement("port");
+ txtNode = m_domDocument.createTextNode(QString::number(p));
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set remote directory
+ tmp = config.readEntry("remote directory", "/");
+ tmpElement = m_domDocument.createElement("defremotepath");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set local directory
+ tmp = config.readEntry("local directory", QDir::homeDirPath());
+ tmpElement = m_domDocument.createElement("deflocalpath");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set username
+ tmp = config.readEntry("username", "anonymous");
+ tmpElement = m_domDocument.createElement("username");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ if (tmp == "anonymous") {
+ tmpElement = m_domDocument.createElement("anonlogin");
+ txtNode = m_domDocument.createTextNode("1");
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+ }
+
+ // Set password
+ tmp = config.readEntry("password");
+ tmpElement = m_domDocument.createElement("password");
+
+ if (tmp == "@EMAIL@" || tmp.isNull() || tmp.isEmpty())
+ tmp = email;
+ else
+ tmp = decodePassword(tmp);
+
+ // We have to encode the password
+ tmp = KCodecs::base64Encode(tmp.ascii(), true).data();
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set retries
+ if (numRetries >= 0) {
+ tmpElement = m_domDocument.createElement("retrytime");
+ txtNode = m_domDocument.createTextNode(QString::number(sleepTime));
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ tmpElement = m_domDocument.createElement("retrycount");
+ txtNode = m_domDocument.createTextNode(QString::number(numRetries));
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+ }
+ }
+
+ emit progress(int(float(counter) / size * 100));
+ ++counter;
+ }
+
+ emit progress(100);
+}
+
+QString KFTPImportGftpPlugin::decodePassword(const QString &password)
+{
+ // Leave unencoded passwords as they are
+ if (password[0] != '$')
+ return password;
+
+ QString work = password;
+ work.remove(0, 1);
+
+ QString result;
+
+ for (uint i = 0; i < work.length() - 1; i += 2) {
+ char c = work.at(i).latin1();
+ char n = work.at(i+1).latin1();
+
+ result.append( ((c & 0x3c) << 2) | ((n & 0x3c) >> 2) );
+ }
+
+ return result;
+}
+
+QDomNode KFTPImportGftpPlugin::findSubGroup(QDomElement parent, const QString& name)
+{
+ QDomNodeList nodeList = parent.childNodes();
+
+ for(unsigned int i = 0; i < nodeList.count(); ++i) {
+ if(nodeList.item(i).toElement().attribute("name") == name)
+ return nodeList.item(i);
+ }
+
+ return QDomNode();
+}
+
+QString KFTPImportGftpPlugin::getDefaultPath()
+{
+ return QString(".gftp/bookmarks");
+}
+
+#include "kftpimportgftpplugin.moc"
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.h b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.h
new file mode 100644
index 0000000..af2bceb
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.h
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPIMPORTGFTPPLUGIN_H
+#define KFTPIMPORTGFTPPLUGIN_H
+
+#include <qdom.h>
+#include <kftpbookmarkimportplugin.h>
+
+/**
+This plugin can import GFTP bookmarks into KFTPGrabber. This plugin has been ported
+from "KBear by Bj�n Sahlstr� <kbjorn@users.sourceforge.net>".
+
+@author Jernej Kos
+*/
+class KFTPImportGftpPlugin : public KFTPBookmarkImportPlugin
+{
+Q_OBJECT
+public:
+ KFTPImportGftpPlugin(QObject *parent, const char *name, const QStringList&);
+
+ /**
+ * This method should return the properly formated XML for KFTPGrabber
+ * bookmarks that is generated from the import.
+ *
+ * @return The @ref QDomDocument representation of XML
+ */
+ QDomDocument getImportedXml();
+
+ /**
+ * This method should start the import procedure.
+ *
+ * @param fileName is the path to the file that will be imported
+ */
+ void import(const QString &fileName);
+
+ /**
+ * This method should return the default path where the bookmarks could
+ * be located. The path must be relative to the user's home directory.
+ *
+ * @return The default path where bookmarks are located
+ */
+ QString getDefaultPath();
+private:
+ QDomDocument m_domDocument;
+
+ QDomNode findSubGroup(QDomElement parent, const QString& name);
+ QString decodePassword(const QString &password);
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportplugin_gftp.desktop b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportplugin_gftp.desktop
new file mode 100644
index 0000000..815f1d4
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/gftp/kftpimportplugin_gftp.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Name=gFTP Import plugin
+Name[ar]=قابس أستيراد gFTP
+Name[bg]=Приставка за импортиране на gFTP
+Name[br]=Lugent enporzh gFTP
+Name[cs]=gFTP importní modul
+Name[da]=gFTP import-plugin
+Name[de]=gFTP-Importmodul
+Name[el]=Πρόσθετο εισαγωγής gFTP
+Name[es]=Complemento de importación de gFTP
+Name[et]=gFTP impordiplugin
+Name[fr]=Module d'importation de gFTP
+Name[ga]=Breiseán Iompórtála gFTP
+Name[gl]=Plugin de importazón de gFTP
+Name[it]=Plugin di importazione gFTP
+Name[ja]=gFTP インポートプラグイン
+Name[ka]=gFTP-ის იმპორტის მოდული
+Name[lt]=gFTP importavimo įskiepis
+Name[nl]=gFTP-importplugin
+Name[pa]=gFTP ਆਯਾਤ ਪਲੱਗਿੰਨ
+Name[pt]='Plugin' de importação do gFTP
+Name[pt_BR]=Plug-in de importação do gFTP
+Name[ru]=Модуль импорта из gFTP
+Name[sr]=Прикључак gFTP увоза
+Name[sr@Latn]=Priključak gFTP uvoza
+Name[sv]=gFTP-importinsticksprogram
+Name[tr]=gFTP'den alma Eklentisi
+Name[uk]=Втулок імпорту gFTP
+Name[xx]=xxgFTP Import pluginxx
+Name[zh_CN]=gFTP 导入插件
+Comment=gFTP bookmarks import plugin for KFTPGrabber
+Comment[ar]=قابس gFTP لإستيراد علامات المواقع لِــ KFTPGrabber
+Comment[bg]=Приставка за импортиране на gFTP отметки в KFTPGrabber
+Comment[br]=Lugent enporzh sinedoù gFTP evit KFTPGrabber
+Comment[cs]=gFTP modul importu záložek pro KFTPGrabber
+Comment[da]=gFTP bogmærker import-plugin for KFTPGrabber
+Comment[de]=gFTP-Lesezeichenimportmodul für KFTPGrabber
+Comment[el]=Πρόσθετο εισαγωγής σελιδοδεικτών του gFTP για το KFTPGrabber
+Comment[es]=Complemento de importación de marcadores de gFTP para KFTPGrabber
+Comment[et]=KFTPGrabberi gFTP järjehoidjate impordiplugin
+Comment[fr]=Module d'importation des signets gFTP pour KFTPGrabber
+Comment[ga]=Breiseán iompórtála leabharmharcanna gFTP le haghaidh KFTPGrabber
+Comment[gl]=Plugin de importazón de marcadores de gFTP para KFTPGrabber
+Comment[it]=Plugin di importazione dei segnalibri di gFTP per KFTPGrabber
+Comment[ja]=KFTPGrabber gFTP のブックマークをインポートするプラグイン
+Comment[ka]=gFTP-ის სანიშნეების იმპორტის მოდული KFTPGrabber-თვის
+Comment[lt]=gFTP žymelių importavimo į KFTPGrabber įskiepis
+Comment[nl]=KFTPGrabber-plugin voor het importeren van gFTP-bladwijzers
+Comment[pt]='Plugin' de importação de favoritos do gFTP para o KFTPGrabber
+Comment[pt_BR]=Plug-in de importação de favoritos do gFTP para o KFTPGrabber
+Comment[ru]=Импорт закладок gFTP в KFTPGrabber
+Comment[sr]=KFTPGrabber-ов прикључак за увоз gFTP маркера
+Comment[sr@Latn]=KFTPGrabber-ov priključak za uvoz gFTP markera
+Comment[sv]=Insticksprogram för gFTP-bokmärkesimport till KFTPgrabber
+Comment[tr]=KFTPGrabber için gFTP yer imlerini alma eklentisi
+Comment[uk]=Втулок імпортування закладок gFTP для KFTPGrabber
+Comment[xx]=xxgFTP bookmarks import plugin for KFTPGrabberxx
+ServiceTypes=KFTPGrabber/BookmarkImportPlugin
+Type=Service
+X-KDE-Library=kftpimportplugin_gftp
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/Makefile.am b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/Makefile.am
new file mode 100644
index 0000000..572413c
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(srcdir)/../../../interfaces \
+ $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kftpimportplugin_kftp.la
+kftpimportplugin_kftp_la_SOURCES = kftpimportkftpplugin.cpp
+kftpimportplugin_kftp_la_LIBADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KPARTS) ../../../interfaces/libkftpinterfaces.la
+kftpimportplugin_kftp_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+kde_services_DATA = kftpimportplugin_kftp.desktop
+noinst_HEADERS = kftpimportkftpplugin.h
+
+pluginsdir = $(kde_datadir)/kftpimportplugin_kftp
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp
new file mode 100644
index 0000000..3ea06d8
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp
@@ -0,0 +1,118 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpimportkftpplugin.h"
+
+#include <qdir.h>
+#include <qfile.h>
+
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmdcodec.h>
+
+K_EXPORT_COMPONENT_FACTORY(kftpimportplugin_kftp,
+ KGenericFactory<KFTPImportKftpPlugin>("kftpimportplugin_kftp"))
+
+KFTPImportKftpPlugin::KFTPImportKftpPlugin(QObject *parent, const char *name, const QStringList&)
+ : KFTPBookmarkImportPlugin(parent, name)
+{
+ KGlobal::locale()->insertCatalogue("kftpgrabber");
+}
+
+QDomDocument KFTPImportKftpPlugin::getImportedXml()
+{
+ return m_domDocument;
+}
+
+void KFTPImportKftpPlugin::import(const QString &fileName)
+{
+ m_domDocument.setContent(QString("<category name=\"%1\"/>").arg(i18n("KFTPGrabber import")));
+
+ // There is actually nothing to import, we just have to read the existing XML and
+ // remove site ids.
+ QFile file(fileName);
+ if (!file.open(IO_ReadOnly)) {
+ emit progress(100);
+ return;
+ }
+
+ m_workDocument.setContent(&file);
+ file.close();
+
+ // Strip all ids
+ stripIds();
+
+ // Now append the bookmarks
+ QDomNode n = m_workDocument.documentElement().firstChild();
+
+ while (!n.isNull()) {
+ QDomNode import = m_domDocument.importNode(n, true);
+ m_domDocument.documentElement().appendChild(import);
+
+ n = n.nextSibling();
+ }
+
+ emit progress(100);
+}
+
+void KFTPImportKftpPlugin::stripIds(QDomNode node)
+{
+ if (node.isNull())
+ node = m_workDocument.documentElement();
+
+ QDomNode n = node.firstChild();
+
+ while (!n.isNull()) {
+ if (n.toElement().tagName() == "category") {
+ if (!n.toElement().hasAttribute("id"))
+ n.toElement().removeAttribute("id");
+
+ stripIds(n);
+ } else if (n.toElement().tagName() == "server") {
+ if (n.toElement().hasAttribute("id"))
+ n.toElement().removeAttribute("id");
+ }
+
+ n = n.nextSibling();
+ }
+}
+
+QString KFTPImportKftpPlugin::getDefaultPath()
+{
+ return QString("");
+}
+
+#include "kftpimportkftpplugin.moc"
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.h b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.h
new file mode 100644
index 0000000..9f2e593
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.h
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPIMPORTKFTPPLUGIN_H
+#define KFTPIMPORTKFTPPLUGIN_H
+
+#include <qdom.h>
+#include <kftpbookmarkimportplugin.h>
+
+/**
+ * This plugin enables importing of KFTPGrabber XML bookmark files into KFTPGrabber,
+ * so the users can import bookmarks that were previously exported.
+ *
+ * @author Jernej Kos
+ */
+class KFTPImportKftpPlugin : public KFTPBookmarkImportPlugin
+{
+Q_OBJECT
+public:
+ KFTPImportKftpPlugin(QObject *parent, const char *name, const QStringList&);
+
+ /**
+ * This method should return the properly formated XML for KFTPGrabber
+ * bookmarks that is generated from the import.
+ *
+ * @return The @ref QDomDocument representation of XML
+ */
+ QDomDocument getImportedXml();
+
+ /**
+ * This method should start the import procedure.
+ *
+ * @param fileName is the path to the file that will be imported
+ */
+ void import(const QString &fileName);
+
+ /**
+ * This method should return the default path where the bookmarks could
+ * be located. The path must be relative to the user's home directory.
+ *
+ * @return The default path where bookmarks are located
+ */
+ QString getDefaultPath();
+private:
+ QDomDocument m_domDocument;
+ QDomDocument m_workDocument;
+
+ void stripIds(QDomNode node = QDomNode());
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportplugin_kftp.desktop b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportplugin_kftp.desktop
new file mode 100644
index 0000000..0cb42ba
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/kftp/kftpimportplugin_kftp.desktop
@@ -0,0 +1,57 @@
+[Desktop Entry]
+Name=KFTPGrabber XML Import plugin
+Name[ar]=قابس الإستيراد لِــ KFTPGrabber XML
+Name[bg]=Приставка за импортиране на XML в KFTPGrabber
+Name[br]=Lugent enporzh XML evit KFTPGrabber
+Name[cs]=KFTPGrabber XML importní modul
+Name[da]=KFTPGrabber XML Import-plugin
+Name[de]=KFTPGrabber XML-Importmodul
+Name[el]=Πρόσθετο εισαγωγής XML του KFTPGrabber
+Name[es]=Complemento de importación de XML de KFTPGrabber
+Name[et]=KFTPGrabberi XML-i impordiplugin
+Name[ga]=Breiseán Iompórtála XML KFTPGrabber
+Name[gl]=Plugin de importazón de XML para KFTPGrabber
+Name[it]=KFTPGrabber Plugin di importazione XML
+Name[ja]=KFTPGrabber XML インポートプラグイン
+Name[ka]=KFTPGrabber-ის XML-ის იმპორტის მოდული
+Name[lt]=KFTPGrabber XML importavimo įskiepis
+Name[nl]=KFTPGrabber XML Importplugin
+Name[pt]='Plugin' de importação XML do KFTPGrabber
+Name[pt_BR]=Plug-in de importação XML do KFTPGrabber
+Name[sr]=Прикључак KFTPGrabber-а за XML увоз
+Name[sr@Latn]=Priključak KFTPGrabber-a za XML uvoz
+Name[sv]=Insticksprogram för XML-import till KFTPgrabber
+Name[tr]=KFTPGrabber XML alma eklentisi
+Name[uk]=Втулок імпортування XML для KFTPGrabber
+Name[xx]=xxKFTPGrabber XML Import pluginxx
+Name[zh_CN]=KFTPGrabber XML 导入插件
+Comment=KFTPGrabber XML bookmarks import plugin
+Comment[ar]=قابس الإستيراد KFTPGrabber XML لعلامات المواقع
+Comment[bg]=Приставка за импортиране на XML отметки в KFTPGrabber
+Comment[br]=Lugent enporzh sinedoù XML KFTPGrabber evit KFTPGrabber
+Comment[cs]=XML modul importu záložek pro KFTPGrabber
+Comment[da]=KFTPGrabber XML bogmærkeimport-plugin
+Comment[de]=KFTPGrabber XML-Lesezeichenimportmodul
+Comment[el]=Πρόσθετο εισαγωγής σελιδοδεικτών XML του KFTPGrabber
+Comment[es]=Complemento de importación de marcadores en XML de KFTPGrabber
+Comment[et]=KFTPGrabberi XML-järjehoidjate impordiplugin
+Comment[ga]=Breiseán iompórtála leabharmharcanna XML le haghaidh KFTPGrabber
+Comment[gl]=Plugin de importazón de marcadores XML para KFTPGrabber
+Comment[it]=Plugin di importazione dei segnalibri XML per KFTPGrabber
+Comment[ja]=KFTPGrabber XML ブックマークをインポートするプラグイン
+Comment[ka]=KFTPGrabber-ის XML-ის სანიშნეების იმპორტის მოდული
+Comment[lt]=KFTPGrabber XML importavimo įskiepis
+Comment[nl]=KFTPGrabber-plugin voor het importeren van XML-bladwijzers
+Comment[pt]='Plugin' de importação de favoritos em XML para o KFTPGrabber
+Comment[pt_BR]=Plug-in de importação de favoritos em XML para o KFTPGrabber
+Comment[sr]=KFTPGrabber-ов прикључак за увоз XML маркера
+Comment[sr@Latn]=KFTPGrabber-ov priključak za uvoz XML markera
+Comment[sv]=Insticksprogram för XML-bokmärkesimport till KFTPgrabber
+Comment[tr]=KFTPGrabber için XML yer imlerini alma eklentisi
+Comment[uk]=Втулок імпортування XML-закладок для KFTPGrabber
+Comment[xx]=xxKFTPGrabber XML bookmarks import pluginxx
+Comment[zh_CN]=KFTPGrabber XML 书签导入插件
+ServiceTypes=KFTPGrabber/BookmarkImportPlugin
+Type=Service
+X-KDE-Library=kftpimportplugin_kftp
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/Makefile.am b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/Makefile.am
new file mode 100644
index 0000000..feb557e
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = -I$(srcdir)/../../../interfaces \
+ $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = kftpimportplugin_ncftp.la
+kftpimportplugin_ncftp_la_SOURCES = kftpimportncftpplugin.cpp
+kftpimportplugin_ncftp_la_LIBADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KPARTS) ../../../interfaces/libkftpinterfaces.la
+kftpimportplugin_ncftp_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+kde_services_DATA = kftpimportplugin_ncftp.desktop
+noinst_HEADERS = kftpimportncftpplugin.h
+
+pluginsdir = $(kde_datadir)/kftpimportplugin_ncftp
+
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp
new file mode 100644
index 0000000..e146f88
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp
@@ -0,0 +1,165 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "kftpimportncftpplugin.h"
+
+#include <qdir.h>
+#include <qfile.h>
+
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kmdcodec.h>
+
+K_EXPORT_COMPONENT_FACTORY(kftpimportplugin_ncftp,
+ KGenericFactory<KFTPImportNcftpPlugin>("kftpimportplugin_ncftp"))
+
+KFTPImportNcftpPlugin::KFTPImportNcftpPlugin(QObject *parent, const char *name, const QStringList&)
+ : KFTPBookmarkImportPlugin(parent, name)
+{
+ KGlobal::locale()->insertCatalogue("kftpgrabber");
+ m_domDocument.setContent(QString("<category name=\"%1\"/>").arg(i18n("NcFtp import")));
+}
+
+QDomDocument KFTPImportNcftpPlugin::getImportedXml()
+{
+ return m_domDocument;
+}
+
+void KFTPImportNcftpPlugin::import(const QString &fileName)
+{
+ /*
+ ARNES FTP serve,ftp.arnes.si,username,*encoded*cGFzc3dvcmQA,,/remote,I,21,4294967295,1,1,-1,1,193.2.1.79,Komentar,,,,,S,-1,/local
+ Redhat,ftp.redhat.com,,,,,I,21,1102099812,-1,-1,-1,1,66.187.224.30,,,,,,S,-1,
+ */
+
+ QFile f(fileName);
+ if (!f.open(IO_ReadOnly)) {
+ emit progress(100);
+ return;
+ }
+
+ QTextStream stream(&f);
+ QString line;
+ int lineNum = 0;
+
+ while (!stream.atEnd()) {
+ line = stream.readLine();
+ if (++lineNum <= 2) continue;
+
+ // Add the imported bookmark
+ QDomElement parentElement = m_domDocument.documentElement();
+
+ // Set name
+ QDomElement siteElement = m_domDocument.createElement("server");
+ siteElement.setAttribute("name", subSection(line, 0));
+ parentElement.appendChild(siteElement);
+
+ // Set host
+ QString tmp = subSection(line, 1);
+ QDomElement tmpElement = m_domDocument.createElement("host");
+ QDomText txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set port
+ tmp = subSection(line, 7, "21");
+ tmpElement = m_domDocument.createElement("port");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set remote directory
+ tmp = subSection(line, 5, "/");
+ tmpElement = m_domDocument.createElement("defremotepath");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set local directory
+ tmp = subSection(line, 21, QDir::homeDirPath());
+ tmpElement = m_domDocument.createElement("deflocalpath");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set username
+ tmp = subSection(line, 2, "anonymous");
+ tmpElement = m_domDocument.createElement("username");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ if (tmp == "anonymous") {
+ tmpElement = m_domDocument.createElement("anonlogin");
+ txtNode = m_domDocument.createTextNode("1");
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+ }
+
+ // Set password
+ tmp = subSection(line, 3, "");
+ tmp.replace("*encoded*", "");
+
+ tmpElement = m_domDocument.createElement("password");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+
+ // Set description
+ tmp = subSection(line, 14, "");
+ if (!tmp.isEmpty()) {
+ tmpElement = m_domDocument.createElement("description");
+ txtNode = m_domDocument.createTextNode(tmp);
+ tmpElement.appendChild(txtNode);
+ siteElement.appendChild(tmpElement);
+ }
+ }
+
+ emit progress(100);
+}
+
+QString KFTPImportNcftpPlugin::subSection(const QString &text, int section, const QString &def)
+{
+ QString tmp = text.section(',', section, section);
+
+ return tmp.isEmpty() ? def : tmp;
+}
+
+QString KFTPImportNcftpPlugin::getDefaultPath()
+{
+ return QString(".ncftp/bookmarks");
+}
+
+#include "kftpimportncftpplugin.moc"
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.h b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.h
new file mode 100644
index 0000000..7a58d0e
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.h
@@ -0,0 +1,80 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPIMPORTNCFTPPLUGIN_H
+#define KFTPIMPORTNCFTPPLUGIN_H
+
+#include <qdom.h>
+#include <kftpbookmarkimportplugin.h>
+
+/**
+This plugin can import NcFTP bookmarks into KFTPGrabber.
+
+@author Jernej Kos
+*/
+class KFTPImportNcftpPlugin : public KFTPBookmarkImportPlugin
+{
+Q_OBJECT
+public:
+ KFTPImportNcftpPlugin(QObject *parent, const char *name, const QStringList&);
+
+ /**
+ * This method should return the properly formated XML for KFTPGrabber
+ * bookmarks that is generated from the import.
+ *
+ * @return The @ref QDomDocument representation of XML
+ */
+ QDomDocument getImportedXml();
+
+ /**
+ * This method should start the import procedure.
+ *
+ * @param fileName is the path to the file that will be imported
+ */
+ void import(const QString &fileName);
+
+ /**
+ * This method should return the default path where the bookmarks could
+ * be located. The path must be relative to the user's home directory.
+ *
+ * @return The default path where bookmarks are located
+ */
+ QString getDefaultPath();
+private:
+ QDomDocument m_domDocument;
+
+ QString subSection(const QString &text, int section, const QString &def = QString::null);
+};
+
+#endif
diff --git a/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportplugin_ncftp.desktop b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportplugin_ncftp.desktop
new file mode 100644
index 0000000..226f2cc
--- /dev/null
+++ b/kftpgrabber/src/misc/plugins/bookmarkimport/ncftp/kftpimportplugin_ncftp.desktop
@@ -0,0 +1,62 @@
+[Desktop Entry]
+Name=NcFTP Import plugin
+Name[ar]=قابس أستيراد NcFTP
+Name[bg]=Приставка за импортиране на NcFTP
+Name[br]=Lugent enporzh NcFTP
+Name[cs]=NcFTP importní modul
+Name[da]=NcFTP import-plugin
+Name[de]=NcFTP Importmodul
+Name[el]=Πρόσθετο εισαγωγής NcFTP
+Name[es]=Complemento de importación de NcFTP
+Name[et]=NcFTP impordiplugin
+Name[fr]=Module d'importation de NcFTP
+Name[ga]=Breiseán Iompórtála NcFTP
+Name[gl]=Plugin de Importazón de NcFTP
+Name[it]=Plugin di importazione NcFTP
+Name[ja]=NcFTP インポートプラグイン
+Name[ka]=NcFTP-ის იმპორტის მოდული
+Name[lt]=NcFTP importavimo įskiepis
+Name[nl]=NcFTP-importplugin
+Name[pa]=NcFTP ਆਯਾਤ ਪਲੱਗਿੰਨ
+Name[pt]='Plugin' de importação do NcFTP
+Name[pt_BR]=Plug-in de importação NcFTP
+Name[ru]=Модуль импорта из NcFTP
+Name[sr]=Прикључак NcFTP увоза
+Name[sr@Latn]=Priključak NcFTP uvoza
+Name[sv]=NcFTP-importinsticksprogram
+Name[tr]=NcFTP'den alma eklentisi
+Name[uk]=Втулок імпорту NcFTP
+Name[xx]=xxNcFTP Import pluginxx
+Name[zh_CN]=NcFTP 导入插件
+Comment=NcFTP bookmarks import plugin for KFTPGrabber
+Comment[ar]=قابس NcFTP لإستيراد علامات المواقع لِــ KFTPGrabber
+Comment[bg]=Приставка за импортиране на NcFTP отметки в KFTPGrabber
+Comment[br]=Lugent enporzh sinedoù NcFTP evit KFTPGrabber
+Comment[cs]=NcFTP modul importu záložek pro KFTPGrabber
+Comment[da]=NcFTP bogmærker import-plugin for KFTPGrabber
+Comment[de]=NcFTP Lesezeichenimportmodul für KFTPGrabber
+Comment[el]=Πρόσθετο εισαγωγής σελιδοδεικτών NcFTP για το KFTPGrabber
+Comment[es]=Complemento de importación de marcadores de NcFTP de KFTPGrabber
+Comment[et]=KFTPGrabberi NcFTP järjehoidjate impordiplugin
+Comment[fr]=Module d'importation des signets NcFTP pour KFTPGrabber
+Comment[ga]=Breiseán iompórtála leabharmharcanna NcFTP le haghaidh KFTPGrabber
+Comment[gl]=Plugin de importazón de marcadores NcFTP para KFTPGrabber
+Comment[it]=Plugin di importazione dei segnalibri di NcFTP per KFTPGrabber
+Comment[ja]=KFTPGrabber NcFTP ブックマークをインポートするプラグイン
+Comment[ka]=NcFTP-ის სანიშნეების იმპორტის მოდული KFTPGrabber-თვის
+Comment[lt]=NcFTP žymelių importavimo į KFTPGrabber įskiepis
+Comment[nl]=Een KFTPGrabber-plugin voor het importeren van NcFTP-bladwijzers
+Comment[pt]='Plugin' de importação de favoritos do NcFTP para o KFTPGrabber
+Comment[pt_BR]=Plug-in de importação de favoritos do NcFTP para o KFTPGrabber
+Comment[ru]=Импорт закладок NcFTP в KFTPGrabber
+Comment[sr]=KFTPGrabber-ов прикључак за увоз NcFTP маркера
+Comment[sr@Latn]=KFTPGrabber-ov priključak za uvoz NcFTP markera
+Comment[sv]=Insticksprogram för NcFTP-bokmärkesimport till KFTPgrabber
+Comment[tr]=KFTPGrabber için NcFTP'den yer imleri alma eklentisi
+Comment[uk]=Втулок імпортування закладок NcFTP для KFTPGrabber
+Comment[xx]=xxNcFTP bookmarks import plugin for KFTPGrabberxx
+Comment[zh_CN]=KFTPGrabber 的 NcFTP 书签导入插件
+ServiceTypes=KFTPGrabber/BookmarkImportPlugin
+Type=Service
+X-KDE-Library=kftpimportplugin_ncftp
+
diff --git a/kftpgrabber/src/queuegroup.cpp b/kftpgrabber/src/queuegroup.cpp
new file mode 100644
index 0000000..f9e49e4
--- /dev/null
+++ b/kftpgrabber/src/queuegroup.cpp
@@ -0,0 +1,128 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "queuegroup.h"
+#include "queueobject.h"
+#include "kftptransfer.h"
+#include "kftpsession.h"
+
+using namespace KFTPSession;
+
+namespace KFTPQueue {
+
+QueueGroup::QueueGroup(QueueObject *object)
+ : QObject(object),
+ m_object(object),
+ m_childIterator(QPtrListIterator<QueueObject>(m_object->m_children)),
+ m_directories(true)
+{
+}
+
+void QueueGroup::reset()
+{
+ m_childIterator.toFirst();
+}
+
+int QueueGroup::executeNextTransfer()
+{
+ // Check if there is actually something to execute
+ if (!m_childIterator.current()) {
+ if (m_lastTransfer && m_lastTransfer->isRunning())
+ return -1;
+
+ if (m_childIterator.count() <= 1)
+ emit done();
+
+ return -1;
+ } else if (!m_directories && m_lastTransfer && m_lastTransfer->isDir()) {
+ return 0;
+ }
+
+ Transfer *transfer = static_cast<Transfer*>(m_childIterator.current());
+
+ // Check if we have enough connections available
+ if (m_lastTransfer) {
+ Session *sourceSession = m_lastTransfer->getSourceSession();
+ Session *destinationSession = m_lastTransfer->getDestinationSession();
+
+ if ((sourceSession && !sourceSession->isFreeConnection()) || (destinationSession && !destinationSession->isFreeConnection()))
+ return 0;
+
+ // Reserve the connections immediately
+ transfer->assignSessions(sourceSession, destinationSession);
+ }
+
+ // Get the transfer instance and schedule it's execution
+ transfer->QObject::disconnect(this);
+
+ connect(transfer, SIGNAL(transferComplete(long)), this, SLOT(incrementAndExecute()));
+ connect(transfer, SIGNAL(transferAbort(long)), this, SIGNAL(interrupted()));
+
+ transfer->delayedExecute();
+
+ // Prepare for the next transfer
+ m_lastTransfer = transfer;
+
+ return 1;
+}
+
+void QueueGroup::incrementAndExecute()
+{
+ if (QObject::sender()) {
+ const Transfer *transfer = static_cast<const Transfer*>(QObject::sender());
+
+ if (!transfer->isDir())
+ m_directories = false;
+ }
+
+ ++m_childIterator;
+
+ int result = executeNextTransfer();
+
+ switch (result) {
+ case 0: --m_childIterator; break;
+ case 1: {
+ m_directories = false;
+ incrementAndExecute();
+ break;
+ }
+ default: break;
+ }
+
+ if (result != -1 && !m_directories)
+ m_directories = true;
+}
+
+}
diff --git a/kftpgrabber/src/queuegroup.h b/kftpgrabber/src/queuegroup.h
new file mode 100644
index 0000000..a8c3562
--- /dev/null
+++ b/kftpgrabber/src/queuegroup.h
@@ -0,0 +1,104 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPQUEUEQUEUEGROUP_H
+#define KFTPQUEUEQUEUEGROUP_H
+
+#include <qguardedptr.h>
+#include <qptrlist.h>
+
+namespace KFTPQueue {
+
+class QueueObject;
+class Transfer;
+
+/**
+ * This class manages a group of child queue objects so they get
+ * executed in the proper order.
+ *
+ * Note that all child transfers that are grouped together must be
+ * part of the same session, otherwise unexpected behavior may
+ * ocurr.
+ *
+ * @author Jernej Kos
+ */
+class QueueGroup : public QObject {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param object The queue object to manage
+ */
+ QueueGroup(QueueObject *object);
+
+ /**
+ * Reset the group.
+ */
+ void reset();
+
+ /**
+ * Execute the next transfer in list.
+ *
+ * @return 1 if the transfer has been executed, 0 or -1 otherwise
+ */
+ int executeNextTransfer();
+public slots:
+ /**
+ * Increment the current iterator and call executeNextTransfer method.
+ */
+ void incrementAndExecute();
+private:
+ QueueObject *m_object;
+ QPtrListIterator<QueueObject> m_childIterator;
+ QGuardedPtr<Transfer> m_lastTransfer;
+ bool m_directories;
+signals:
+ /**
+ * This signal gets emitted when there is nothing more to do in the
+ * queue.
+ */
+ void done();
+
+ /**
+ * This signal gets emitted when the group processing is interrupted
+ * due to abort.
+ */
+ void interrupted();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/queueobject.cpp b/kftpgrabber/src/queueobject.cpp
new file mode 100644
index 0000000..454da84
--- /dev/null
+++ b/kftpgrabber/src/queueobject.cpp
@@ -0,0 +1,275 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "queueobject.h"
+#include "kftpqueue.h"
+
+#include <qtimer.h>
+
+namespace KFTPQueue {
+
+QueueObject::QueueObject(QObject *parent, Type type)
+ : QObject(parent),
+ m_aborting(false),
+ m_status(Stopped),
+ m_type(type),
+ m_size(0),
+ m_actualSize(0),
+ m_completed(0),
+ m_resumed(0),
+ m_speed(0)
+{
+ // Add the transfer
+ if (hasParentObject())
+ static_cast<QueueObject*>(parent)->addChildObject(this);
+
+ // Connect the delayed execution timer
+ connect(&m_delayedExecuteTimer, SIGNAL(timeout()), this, SLOT(execute()));
+}
+
+
+QueueObject::~QueueObject()
+{
+}
+
+void QueueObject::delayedExecute(int msec)
+{
+ /* Execute the transfer with delay - using a QTimer */
+ if (msec > 1000)
+ msec = 1000;
+
+ if (!m_delayedExecuteTimer.isActive())
+ m_delayedExecuteTimer.start(msec, true);
+}
+
+void QueueObject::execute()
+{
+}
+
+
+void QueueObject::addActualSize(filesize_t size)
+{
+ if (size == 0)
+ return;
+
+ m_actualSize += size;
+
+ if (hasParentObject())
+ parentObject()->addActualSize(size);
+
+ statisticsUpdated();
+}
+
+void QueueObject::addSize(filesize_t size)
+{
+ if (size == 0)
+ return;
+
+ m_size += size;
+ m_actualSize += size;
+
+ if (hasParentObject())
+ parentObject()->addSize(size);
+
+ statisticsUpdated();
+}
+
+void QueueObject::addCompleted(filesize_t completed)
+{
+ if (completed == 0)
+ return;
+
+ m_completed += completed;
+
+ if (hasParentObject())
+ parentObject()->addCompleted(completed);
+
+ statisticsUpdated();
+}
+
+void QueueObject::setSpeed(filesize_t speed)
+{
+ if (speed != 0 && m_speed == speed)
+ return;
+
+ m_speed = speed;
+
+ QPtrListIterator<QueueObject> it(m_children);
+ QueueObject *i;
+
+ while ((i = it.current()) != 0) {
+ ++it;
+
+ m_speed += i->getSpeed();
+ }
+
+ if (hasParentObject())
+ parentObject()->setSpeed();
+
+ statisticsUpdated();
+}
+
+void QueueObject::statisticsUpdated()
+{
+ emit objectUpdated();
+}
+
+void QueueObject::abort()
+{
+}
+
+void QueueObject::addChildObject(QueueObject *object)
+{
+ m_children.append(object);
+
+ connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(slotChildDestroyed(QObject*)));
+}
+
+void QueueObject::delChildObject(QueueObject *object)
+{
+ m_children.removeRef(object);
+}
+
+void QueueObject::slotChildDestroyed(QObject *child)
+{
+ // Remove the transfer
+ delChildObject(static_cast<QueueObject*>(child));
+}
+
+QueueObject *QueueObject::findChildObject(long id)
+{
+ QPtrListIterator<QueueObject> it(m_children);
+ QueueObject *i;
+
+ while ((i = it.current()) != 0) {
+ ++it;
+
+ if (i->getId() == id)
+ return i;
+
+ if (i->hasChildren()) {
+ QueueObject *tmp = i->findChildObject(id);
+
+ if (tmp)
+ return tmp;
+ }
+ }
+
+ return NULL;
+}
+
+void QueueObject::removeMarkedTransfers()
+{
+ QPtrListIterator<QueueObject> it(m_children);
+ QueueObject *i;
+
+ while ((i = it.current()) != 0) {
+ ++it;
+
+ if (i->hasChildren())
+ i->removeMarkedTransfers();
+
+ if (i->isTransfer() && static_cast<Transfer*>(i)->isDeleteMarked())
+ Manager::self()->removeTransfer(static_cast<Transfer*>(i));
+ }
+}
+
+bool QueueObject::canMove()
+{
+ return true;
+}
+
+void QueueObject::moveChildUp(QueueObject *child)
+{
+ if (m_children.findRef(child) != -1) {
+ if (m_children.prev()) {
+ int prevPos = m_children.at();
+ m_children.removeRef(child);
+ m_children.insert(prevPos, child);
+ }
+ }
+}
+
+void QueueObject::moveChildDown(QueueObject *child)
+{
+ if (m_children.findRef(child) != -1) {
+ if (m_children.next()) {
+ int nextPos = m_children.at();
+ m_children.removeRef(child);
+ m_children.insert(nextPos, child);
+ }
+ }
+}
+
+void QueueObject::moveChildTop(QueueObject *child)
+{
+ m_children.removeRef(child);
+ m_children.prepend(child);
+}
+
+void QueueObject::moveChildBottom(QueueObject *child)
+{
+ m_children.removeRef(child);
+ m_children.append(child);
+}
+
+bool QueueObject::canMoveChildUp(QueueObject *child)
+{
+ if (!child->canMove()) return false;
+ if (m_children.getFirst() == child) return false;
+
+ if (m_children.findRef(child) != -1) {
+ if (m_children.prev() && !m_children.current()->canMove())
+ return false;
+ }
+
+ return true;
+}
+
+bool QueueObject::canMoveChildDown(QueueObject *child)
+{
+ if (!child->canMove()) return false;
+ if (m_children.getLast() == child) return false;
+
+ if (m_children.findRef(child) != -1) {
+ if (m_children.next() && !m_children.current()->canMove())
+ return false;
+ }
+
+ return true;
+}
+
+}
+#include "queueobject.moc"
diff --git a/kftpgrabber/src/queueobject.h b/kftpgrabber/src/queueobject.h
new file mode 100644
index 0000000..a8e7088
--- /dev/null
+++ b/kftpgrabber/src/queueobject.h
@@ -0,0 +1,372 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPQUEUEQUEUEOBJECT_H
+#define KFTPQUEUEQUEUEOBJECT_H
+
+#include <qobject.h>
+#include <qptrlist.h>
+#include <qtimer.h>
+
+#include "engine/directorylisting.h"
+
+namespace KFTPQueue {
+
+class QueueGroup;
+
+/**
+ * This class represents a basic object that can be queued.
+ *
+ * @author Jernej Kos
+ */
+class QueueObject : public QObject
+{
+friend class QueueGroup;
+Q_OBJECT
+public:
+ enum Type {
+ File,
+ Directory,
+ Site,
+ Toplevel
+ };
+
+ enum Status {
+ Running,
+ Stopped,
+ Connecting,
+ Locked,
+ Failed,
+ Waiting
+ };
+
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent object
+ * @param type Object type
+ */
+ QueueObject(QObject *parent, Type type);
+
+ /**
+ * Class destructor.
+ */
+ ~QueueObject();
+
+ /**
+ * Returns true if this object has a parent object.
+ *
+ * @return True if this object has a parent object
+ */
+ bool hasParentObject() const { return parent() ? parent()->inherits("KFTPQueue::QueueObject") : false; }
+
+ /**
+ * Returns the parent QueueObject.
+ *
+ * @return The parent QueueObject
+ */
+ QueueObject *parentObject() const { return static_cast<QueueObject*>(parent()); }
+
+ /**
+ * Do we have any children ?
+ *
+ * @return True if we have some kids
+ */
+ bool hasChildren() const { return m_children.count() > 0; }
+
+ /**
+ * Get object status.
+ *
+ * @return Status of this object
+ */
+ Status getStatus() const { return m_status; }
+
+ /**
+ * Is this object currently running ?
+ *
+ * @return true if this object's status is set to Running or Connecting
+ */
+ bool isRunning() const { return m_status == Running || m_status == Connecting || m_status == Waiting; }
+
+ /**
+ * Is the object currently locked ?
+ *
+ * @return true if this object's status is set to Locked
+ */
+ bool isLocked() const { return m_status == Locked; }
+
+ /**
+ * Is this object currently aborting ?
+ *
+ * @return true if this object is currently aborting
+ */
+ bool isAborting() const { return m_aborting; }
+
+ /**
+ * Returns the size of this queue object.
+ *
+ * @return Size
+ */
+ filesize_t getSize() const { return m_size; }
+
+ /**
+ * Returns the actual size - that is usefull only if this is a directory since
+ * it returns the current size of all its items (if some items were removed
+ * from its first scan getSize() will return the initial size and getActualSize()
+ * will return current size of all items). If this is not a directory, this
+ * will return the same value as getSize();
+ *
+ * @return Actual directory size
+ */
+ filesize_t getActualSize() const { return m_actualSize; }
+
+ /**
+ * Returns the already transfered file/dir size.
+ *
+ * @return Transfered file/dir size
+ */
+ filesize_t getCompleted() const { return m_completed; }
+
+ /**
+ * Returns the number of bytes that have been resumed (using REST).
+ *
+ * @return Resume offset
+ */
+ filesize_t getResumed() const { return m_resumed; }
+
+ /**
+ * Get current transfer speed or 0 if the transfer is stalled.
+ *
+ * @return Transfer speed
+ */
+ filesize_t getSpeed() const { return m_speed; }
+
+ /**
+ * Adds size bytes to the current transfer size. This will also update all
+ * parent transfers (if any).
+ *
+ * @param size Size to add
+ */
+ void addSize(filesize_t size);
+
+ /**
+ * Adds completed bytes to the current completed size. This will also update all
+ * parent transfers (if any).
+ *
+ * @param completed Size to add
+ */
+ void addCompleted(filesize_t completed);
+
+ /**
+ * Set the current transfer speed. This will also update all parent transfers.
+ *
+ * @param speed Speed to set
+ */
+ void setSpeed(filesize_t speed = 0);
+
+ /**
+ * Returns the KFTPQueue::Transfer::Type of this transfer. This can either be
+ * File or Directory.
+ *
+ * @return Transfer type
+ */
+ Type getType() const { return m_type; }
+
+ /**
+ * Is this object a directory ?
+ *
+ * @return true if this object's type is set to Directory
+ */
+ bool isDir() const { return m_type == Directory; }
+
+ /**
+ * Is this object a transfer ?
+ *
+ * @return true if this object's type is File or Directory
+ */
+ bool isTransfer() const { return m_type == File || m_type == Directory; }
+
+ /**
+ * Delays transfer execution for msec miliseconds. If this number is greater than
+ * 1000, it will be set to 1000.
+ *
+ * @param msec Number of miliseconds to delay execution
+ */
+ void delayedExecute(int msec = 100);
+
+ /**
+ * Set transfer's ID.
+ *
+ * @param id Transfer identifier (must be unique)
+ */
+ void setId(long id) { m_id = id; }
+
+ /**
+ * Get transfer's ID.
+ *
+ * @return Transfer's unique ID number
+ */
+ long getId() const { return m_id; }
+
+ /**
+ * Abort current transfer.
+ */
+ virtual void abort();
+
+ /**
+ * Add a child queue object to this object. The object is NOT reparented!
+ *
+ * @param object The child queue object
+ */
+ void addChildObject(QueueObject *object);
+
+ /**
+ * Delete a child queue object from this object. The object is NOT reparented!
+ *
+ * @param object The child queue object
+ */
+ void delChildObject(QueueObject *object);
+
+ /**
+ * Find a QueueObject that is child of the current object by its id. This
+ * method goes trough all the objects under this one.
+ *
+ * @param id Object's id
+ * @return A valid QueueObject or NULL if no such object can be found
+ */
+ QueueObject *findChildObject(long id);
+
+ /**
+ * Removes all transfers that have been marked for deletion.
+ */
+ void removeMarkedTransfers();
+
+ /**
+ * Move a child object up in the queue.
+ *
+ * @param child The object to move
+ */
+ void moveChildUp(QueueObject *child);
+
+ /**
+ * Move a child object down in the queue.
+ *
+ * @param child The object to move
+ */
+ void moveChildDown(QueueObject *child);
+
+ /**
+ * Move a child object to the top.
+ *
+ * @param child The object to move
+ */
+ void moveChildTop(QueueObject *child);
+
+ /**
+ * Move a child object to the bottom.
+ *
+ * @param child The object to move
+ */
+ void moveChildBottom(QueueObject *child);
+
+ /**
+ * Can a child be moved up ?
+ *
+ * @param child The child to be moved
+ * @return True if the child can be moved up
+ */
+ bool canMoveChildUp(QueueObject *child);
+
+ /**
+ * Can a child be moved down ?
+ *
+ * @param child The child to be moved
+ * @return True if the child can be moved down
+ */
+ bool canMoveChildDown(QueueObject *child);
+
+ /**
+ * Returns the list of this object's child QueueObjects.
+ *
+ * @return A QueueObject list
+ */
+ QPtrList<QueueObject> getChildrenList() const { return m_children; }
+public slots:
+ /**
+ * Execute this queue object.
+ */
+ virtual void execute();
+protected:
+ bool m_aborting;
+ Status m_status;
+
+ long m_id;
+ Type m_type;
+ QPtrList<QueueObject> m_children;
+
+ QTimer m_delayedExecuteTimer;
+
+ /* Statistical information */
+ filesize_t m_size;
+ filesize_t m_actualSize;
+ filesize_t m_completed;
+ filesize_t m_resumed;
+ filesize_t m_speed;
+
+ void addActualSize(filesize_t size);
+
+ /**
+ * This method is called every time the object's statistics must be
+ * updated.
+ */
+ virtual void statisticsUpdated();
+
+ /**
+ * This method should return true if the object can be moved.
+ */
+ virtual bool canMove();
+private slots:
+ void slotChildDestroyed(QObject *child);
+signals:
+ /**
+ * This signal gets emitted when the object's state has changed in
+ * some way.
+ */
+ void objectUpdated();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/site.cpp b/kftpgrabber/src/site.cpp
new file mode 100644
index 0000000..6f6668f
--- /dev/null
+++ b/kftpgrabber/src/site.cpp
@@ -0,0 +1,99 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "site.h"
+#include "queuegroup.h"
+#include "kftpqueue.h"
+
+namespace KFTPQueue {
+
+Site::Site(QueueObject *parent, KURL url)
+ : QueueObject(parent, QueueObject::Site),
+ m_group(new QueueGroup(this))
+{
+ url.setPath("/");
+ m_siteUrl = url;
+
+ // Connect to some group signals
+ connect(m_group, SIGNAL(interrupted()), this, SLOT(slotGroupInterrupted()));
+}
+
+void Site::execute()
+{
+ m_completed = 0;
+ m_resumed = 0;
+ m_status = Running;
+
+ // Reset and start the group
+ m_group->reset();
+ m_group->executeNextTransfer();
+}
+
+void Site::abort()
+{
+ // If not running, just return
+ if (!isRunning())
+ return;
+
+ // Set the aborting flag
+ m_aborting = true;
+ emit siteAborted();
+
+ // Signal abort to all child transfers
+ QueueObject *i;
+
+ for (i = m_children.first(); i; i = m_children.next()) {
+ if (i->isRunning() && !i->isAborting())
+ i->abort();
+ }
+
+ // Clear all the stuff
+ m_status = Stopped;
+ m_resumed = 0;
+ m_completed = 0;
+ m_aborting = false;
+ m_size = m_actualSize;
+
+ emit objectUpdated();
+}
+
+void Site::slotGroupInterrupted()
+{
+ if (!m_aborting)
+ abort();
+}
+
+}
+#include "site.moc"
diff --git a/kftpgrabber/src/site.h b/kftpgrabber/src/site.h
new file mode 100644
index 0000000..e574993
--- /dev/null
+++ b/kftpgrabber/src/site.h
@@ -0,0 +1,89 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPQUEUESITE_H
+#define KFTPQUEUESITE_H
+
+#include "queueobject.h"
+
+#include <kurl.h>
+
+namespace KFTPQueue {
+
+/**
+ * This class represents a site.
+ *
+ * @author Jernej Kos
+ */
+class Site : public QueueObject
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent object
+ * @param url The site's URL
+ */
+ Site(QueueObject *parent, KURL url);
+
+ /**
+ * Return the site's URL
+ *
+ * @return The URL for this site
+ */
+ KURL getUrl() const { return m_siteUrl; }
+
+ /**
+ * Process all child transfers, one by one (just like in TransferDir).
+ */
+ void execute();
+
+ /**
+ * Abort transfer processing.
+ */
+ void abort();
+private:
+ KURL m_siteUrl;
+ QueueGroup *m_group;
+private slots:
+ void slotGroupInterrupted();
+signals:
+ void siteAborted();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/statistics.cpp b/kftpgrabber/src/statistics.cpp
new file mode 100644
index 0000000..cdd55e2
--- /dev/null
+++ b/kftpgrabber/src/statistics.cpp
@@ -0,0 +1,89 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "statistics.h"
+
+#include <kstaticdeleter.h>
+
+namespace KFTPQueue {
+
+Statistics *Statistics::m_self = 0;
+static KStaticDeleter<Statistics> staticStatsDeleter;
+
+StatisticsSite::StatisticsSite()
+ : m_lastFxpSpeed(0.0)
+{
+}
+
+Statistics *Statistics::self()
+{
+ if (!m_self) {
+ staticStatsDeleter.setObject(m_self, new Statistics());
+ }
+
+ return m_self;
+}
+
+Statistics::Statistics()
+{
+ m_sites.setAutoDelete(true);
+}
+
+Statistics::~Statistics()
+{
+ if (m_self == this)
+ staticStatsDeleter.setObject(m_self, 0, false);
+}
+
+StatisticsSite *Statistics::getSite(const KURL &url)
+{
+ // Reset the url's path and grab the site
+ KURL tmp = url;
+ tmp.setPath("/");
+
+ StatisticsSite *site = m_sites[tmp.url()];
+
+ if (!site) {
+ site = new StatisticsSite();
+ m_sites.insert(tmp.url(), site);
+ }
+
+ return site;
+}
+
+}
+
+#include "statistics.moc"
diff --git a/kftpgrabber/src/statistics.h b/kftpgrabber/src/statistics.h
new file mode 100644
index 0000000..1f0f309
--- /dev/null
+++ b/kftpgrabber/src/statistics.h
@@ -0,0 +1,117 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUESTATISTICS_H
+#define KFTPQUEUESTATISTICS_H
+
+#include <qobject.h>
+#include <qdict.h>
+
+#include <kurl.h>
+#include <kio/global.h>
+
+namespace KFTPQueue {
+
+/**
+ * This class represents a statistics for a single site.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class StatisticsSite {
+public:
+ StatisticsSite();
+
+ /**
+ * Set the site's last FXP speed.
+ *
+ * @param speed Site's last FXP speed
+ */
+ void setLastFxpSpeed(double speed) { m_lastFxpSpeed = speed; }
+
+ /**
+ * Get the site's last FXP speed.
+ *
+ * @return Site's last FXP speed
+ */
+ double lastFxpSpeed() const { return m_lastFxpSpeed; }
+private:
+ double m_lastFxpSpeed;
+};
+
+/**
+ * This class provides different kind of per-site statistics.
+ *
+ * @author Jernej Kos <kostko@unimatrix-one.org>
+ */
+class Statistics : public QObject
+{
+Q_OBJECT
+public:
+ /**
+ * Returns the global statistics class instance.
+ */
+ static Statistics *self();
+
+ /**
+ * Class destructor.
+ */
+ ~Statistics();
+
+ /**
+ * Returns a site that corresponds to the given URL. If the site doesn't
+ * exist it is created.
+ *
+ * @param url The site's URL
+ * @return A valid StatisticsSite pointer
+ */
+ StatisticsSite *getSite(const KURL &url);
+protected:
+ /**
+ * Global class instance.
+ */
+ static Statistics *m_self;
+
+ /**
+ * Class constructor.
+ */
+ Statistics();
+private:
+ QDict<StatisticsSite> m_sites;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/ui/Makefile.am b/kftpgrabber/src/ui/Makefile.am
new file mode 100644
index 0000000..50aff1c
--- /dev/null
+++ b/kftpgrabber/src/ui/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = -I$(top_srcdir) \
+ -I$(srcdir)/.. \
+ -I$(srcdir)/../widgets \
+ -I$(srcdir)/../widgets/queueview \
+ $(all_includes)
+
+METASOURCES = AUTO
+noinst_LIBRARIES = libui.a
+
+libui_a_SOURCES = bookmark_properties.ui kftpfilteraddpatternlayout.ui \
+ kftpquickconnectlayout.ui kftpqueueeditorlayout.ui kftpsearchlayout.ui \
+ kftpbookmarkimportlayout.ui kftpbookmarkeditortlswidget.ui config_general.ui \
+ config_transfers.ui config_log.ui config_display.ui config_filters.ui \
+ foobar.cpp checksum_verifier.ui
+
+noinst_HEADERS = foobar.h
diff --git a/kftpgrabber/src/ui/bookmark_properties.ui b/kftpgrabber/src/ui/bookmark_properties.ui
new file mode 100644
index 0000000..a41d18a
--- /dev/null
+++ b/kftpgrabber/src/ui/bookmark_properties.ui
@@ -0,0 +1,620 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>BookmarkProperties</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>BookmarkProperties</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>458</width>
+ <height>475</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>ftpSiteProperties</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabList</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>general</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;General</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</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>Hostname:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Protocol:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>FTP</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>FTP over TLS/SSL (explicit)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>FTP over TLS/SSL (implicit)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SFTP over SSH2</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>serverProtocol</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>protoAdvanced</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="7" column="1">
+ <property name="name">
+ <cstring>defRemoteDir</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>serverAddress</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>serverPort</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="value">
+ <number>21</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Site label:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>serverName</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="7" column="0">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Remote directory:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Local directory:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="4" column="1">
+ <property name="name">
+ <cstring>downUser</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="6" column="1">
+ <property name="name">
+ <cstring>defLocalDir</cstring>
+ </property>
+ </widget>
+ <widget class="KPasswordEdit" row="5" column="1">
+ <property name="name">
+ <cstring>downPass</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>anonLogin</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Anonymous login</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox5_2</cstring>
+ </property>
+ <property name="title">
+ <string>Description</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>description</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>advanced</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Advanced</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>disableEPSV</cstring>
+ </property>
+ <property name="text">
+ <string>Disa&amp;ble use of extended passive mode</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>disablePASV</cstring>
+ </property>
+ <property name="text">
+ <string>Disable use of passive mode</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>pasvSiteIp</cstring>
+ </property>
+ <property name="text">
+ <string>Use site IP for passive mode connections</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>disableForceIp</cstring>
+ </property>
+ <property name="text">
+ <string>Disable "force active mode to use this IP" for this site</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>statListings</cstring>
+ </property>
+ <property name="text">
+ <string>Use STAT for directory listings</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Multiple Transfer Threads</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>threadsDisable</cstring>
+ </property>
+ <property name="text">
+ <string>Do not use multiple threads for this site</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox8</cstring>
+ </property>
+ <property name="title">
+ <string>Server Encoding</string>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>11</x>
+ <y>21</y>
+ <width>61</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Encoding:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>serverEncoding</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>78</x>
+ <y>21</y>
+ <width>341</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </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>430</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>keepalive</cstring>
+ </property>
+ <attribute name="title">
+ <string>Retry &amp;&amp; &amp;Keepalive</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>doRetry</cstring>
+ </property>
+ <property name="text">
+ <string>Retr&amp;y to connect on failure</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>retryGroup</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Retry</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel12</cstring>
+ </property>
+ <property name="text">
+ <string>Number of retries (0 = infinite):</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel11</cstring>
+ </property>
+ <property name="text">
+ <string>Retry delay:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="3">
+ <property name="name">
+ <cstring>retryCount</cstring>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ </widget>
+ <spacer row="0" column="1" rowspan="1" colspan="2">
+ <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>240</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="2">
+ <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>140</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox" row="0" column="3">
+ <property name="name">
+ <cstring>retryDelay</cstring>
+ </property>
+ <property name="maxValue">
+ <number>9999</number>
+ </property>
+ <property name="value">
+ <number>60</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>doKeepalive</cstring>
+ </property>
+ <property name="text">
+ <string>Use keepalive packets to keep the connection open</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>keepaliveGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Keepalive</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <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>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Keepalive frequency (seconds):</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>141</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>keepaliveTimeout</cstring>
+ </property>
+ <property name="maxValue">
+ <number>600</number>
+ </property>
+ <property name="minValue">
+ <number>30</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>tabList</tabstop>
+ <tabstop>serverName</tabstop>
+ <tabstop>serverAddress</tabstop>
+ <tabstop>serverPort</tabstop>
+ <tabstop>serverProtocol</tabstop>
+ <tabstop>protoAdvanced</tabstop>
+ <tabstop>anonLogin</tabstop>
+ <tabstop>downUser</tabstop>
+ <tabstop>downPass</tabstop>
+ <tabstop>defLocalDir</tabstop>
+ <tabstop>defRemoteDir</tabstop>
+ <tabstop>description</tabstop>
+ <tabstop>disableEPSV</tabstop>
+ <tabstop>disablePASV</tabstop>
+ <tabstop>pasvSiteIp</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpassdlg.h</includehint>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/checksum_verifier.ui b/kftpgrabber/src/ui/checksum_verifier.ui
new file mode 100644
index 0000000..be2f8af
--- /dev/null
+++ b/kftpgrabber/src/ui/checksum_verifier.ui
@@ -0,0 +1,340 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>VerifierLayout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>VerifierLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>500</width>
+ <height>490</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>500</width>
+ <height>490</height>
+ </size>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox23</cstring>
+ </property>
+ <property name="title">
+ <string>Progress</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KProgress" row="1" column="0">
+ <property name="name">
+ <cstring>checkProgress</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout57</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;File:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>currentFile</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>none</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox24</cstring>
+ </property>
+ <property name="title">
+ <string>File list</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>fileList</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout68</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout64</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel11</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Unprocessed</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout65</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel11_2</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>0</red>
+ <green>255</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Ok</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout66</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel11_3</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>188</red>
+ <green>188</green>
+ <blue>188</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel9</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Not found</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout67</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel11_4</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>255</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel10</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Failed</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer21</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>260</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kprogress.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/config_display.ui b/kftpgrabber/src/ui/config_display.ui
new file mode 100644
index 0000000..1734bf1
--- /dev/null
+++ b/kftpgrabber/src/ui/config_display.ui
@@ -0,0 +1,137 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>DisplaySettings</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DisplaySettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>537</width>
+ <height>424</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget6</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Displa&amp;y</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox32</cstring>
+ </property>
+ <property name="title">
+ <string>File &amp;Browser</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showHiddenFiles</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;hidden files and directories</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showTree</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;directory tree</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showSizeInBytes</cstring>
+ </property>
+ <property name="text">
+ <string>Show filesi&amp;ze in bytes (toggle for "human readable" format)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showOwnerGroup</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;owner and group for each file</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showDirectorySize</cstring>
+ </property>
+ <property name="text">
+ <string>Show directory &amp;size</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;Other Interface Elements</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showLeftSidebar</cstring>
+ </property>
+ <property name="text">
+ <string>Show left sidebar</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kftpgrabber/src/ui/config_filters.ui b/kftpgrabber/src/ui/config_filters.ui
new file mode 100644
index 0000000..f9ac803
--- /dev/null
+++ b/kftpgrabber/src/ui/config_filters.ui
@@ -0,0 +1,137 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>ConfigFilterLayout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigFilterLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>596</width>
+ <height>451</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KFTPFilterEditorLayout</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>ASCII E&amp;xtensions</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="1">
+ <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>212</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>addExtButton</cstring>
+ </property>
+ <property name="text">
+ <string>Add Extension</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>removeExtButton</cstring>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Extension:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>newExtension</cstring>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Extension</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>extensionList</cstring>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/config_general.ui b/kftpgrabber/src/ui/config_general.ui
new file mode 100644
index 0000000..9fd4f94
--- /dev/null
+++ b/kftpgrabber/src/ui/config_general.ui
@@ -0,0 +1,440 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>GeneralSettings</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>GeneralSettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>544</width>
+ <height>398</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget3</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;General</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox22</cstring>
+ </property>
+ <property name="title">
+ <string>E-mail &amp;Address</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_globalMail</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use e-mail address from control center</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout26</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>E-mail:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>kcfg_anonMail</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox13</cstring>
+ </property>
+ <property name="title">
+ <string>Startup and Exit</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_confirmExit</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm program e&amp;xit if there are active transfers</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_startMinimized</cstring>
+ </property>
+ <property name="text">
+ <string>Start the program minimi&amp;zed to systray</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showSplash</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;splash screen on startup</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showSystrayIcon</cstring>
+ </property>
+ <property name="text">
+ <string>Show the s&amp;ystray icon</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_exitOnClose</cstring>
+ </property>
+ <property name="text">
+ <string>Ex&amp;it by default when clicking the X button</string>
+ </property>
+ </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>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Bookmarks</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox10</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Site Defaults</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <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>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Local directory:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>kcfg_defLocalDir</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Retry delay:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_retryTime</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <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>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Number of retries (0 = infinite):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_retryCount</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </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>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Encoding:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>cfg_defEncoding</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox11</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_encryptBookmarks</cstring>
+ </property>
+ <property name="text">
+ <string>Encr&amp;ypt bookmark file</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showWalletSites</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show sites from KWallet among bookmarks</string>
+ </property>
+ </widget>
+ </vbox>
+ </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>21</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Notification</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox12</cstring>
+ </property>
+ <property name="title">
+ <string>Balloons</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showBalloons</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show balloon when transfer completes</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showBalloonWhenQueueEmpty</cstring>
+ </property>
+ <property name="text">
+ <string>Only show when &amp;queue is empty after transfer</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_showRetrySuccessBalloon</cstring>
+ </property>
+ <property name="text">
+ <string>Show balloon when connection retr&amp;y succeeds</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <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>21</width>
+ <height>111</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/config_log.ui b/kftpgrabber/src/ui/config_log.ui
new file mode 100644
index 0000000..9424672
--- /dev/null
+++ b/kftpgrabber/src/ui/config_log.ui
@@ -0,0 +1,355 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>LogSettings</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>LogSettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>688</width>
+ <height>402</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget5</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Appearance</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox27</cstring>
+ </property>
+ <property name="title">
+ <string>Font &amp;&amp; Colors</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout37</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel10</cstring>
+ </property>
+ <property name="text">
+ <string>Font:</string>
+ </property>
+ </widget>
+ <widget class="KFontRequester">
+ <property name="name">
+ <cstring>kcfg_logFont</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout32</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel11</cstring>
+ </property>
+ <property name="text">
+ <string>Client command color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>kcfg_logCommandsColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </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>textLabel12</cstring>
+ </property>
+ <property name="text">
+ <string>Server response color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>kcfg_logResponsesColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout34</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel13</cstring>
+ </property>
+ <property name="text">
+ <string>Multiline response color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>kcfg_logMultilineColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout35</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel14</cstring>
+ </property>
+ <property name="text">
+ <string>Error message color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>kcfg_logErrorColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout36</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel15</cstring>
+ </property>
+ <property name="text">
+ <string>Status message color:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>kcfg_logStatusColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>111</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Output</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox28</cstring>
+ </property>
+ <property name="title">
+ <string>&amp;File Output</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_saveToFile</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Save log to file</string>
+ </property>
+ </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>textLabel16</cstring>
+ </property>
+ <property name="text">
+ <string>Output file:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>kcfg_outputFilename</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <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>61</width>
+ <height>171</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kfontrequester.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/config_transfers.ui b/kftpgrabber/src/ui/config_transfers.ui
new file mode 100644
index 0000000..22c5b48
--- /dev/null
+++ b/kftpgrabber/src/ui/config_transfers.ui
@@ -0,0 +1,734 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>TransferSettings</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>TransferSettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>646</width>
+ <height>592</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget4</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Co&amp;nnection</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox19</cstring>
+ </property>
+ <property name="title">
+ <string>Active Connection IP</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_portForceIp</cstring>
+ </property>
+ <property name="text">
+ <string>Force PORT/EPRT to &amp;use configured IP</string>
+ </property>
+ </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>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>IP/hostname:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>kcfg_portIp</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_ignoreExternalIpForLan</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Ignore external IP for LAN connections</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Active Connection Port Range</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_activeForcePort</cstring>
+ </property>
+ <property name="text">
+ <string>Onl&amp;y use ports from the specified port range</string>
+ </property>
+ </widget>
+ <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</cstring>
+ </property>
+ <property name="text">
+ <string>Minimum port:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_activeMinPort</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>70</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</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 port:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_activeMaxPort</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>70</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox6</cstring>
+ </property>
+ <property name="title">
+ <string>Timeouts</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="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Control connection timeout (in seconds):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_controlTimeout</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>70</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ </widget>
+ </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>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Data transfer timeout (in seconds):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_dataTimeout</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>70</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox7</cstring>
+ </property>
+ <property name="title">
+ <string>Speed limit</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>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Download (KB/s):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_downloadSpeedLimit</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>70</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Upload (KB/s):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_uploadSpeedLimit</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>70</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Dis&amp;k Space</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox20</cstring>
+ </property>
+ <property name="title">
+ <string>Free Disk Space Check</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_diskCheckSpace</cstring>
+ </property>
+ <property name="text">
+ <string>Stop transfer if there is &amp;not enough free space</string>
+ </property>
+ </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>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Interval (sec):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_diskCheckInterval</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout25</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Minimum free space (MiB):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_diskMinFreeSpace</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>191</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>Thre&amp;ads</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox23</cstring>
+ </property>
+ <property name="title">
+ <string>Threads</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout27</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel9</cstring>
+ </property>
+ <property name="text">
+ <string>Number of threads per session:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_threadCount</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_threadUsePrimary</cstring>
+ </property>
+ <property name="text">
+ <string>Use the primary connection for transfers</string>
+ </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>21</width>
+ <height>360</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>TabPage</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Miscellaneous</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox8</cstring>
+ </property>
+ <property name="title">
+ <string>Failed Transfers</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_failedAutoRetry</cstring>
+ </property>
+ <property name="text">
+ <string>Automatically retry failed transfers</string>
+ </property>
+ </widget>
+ <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 number of retries before marking as failed:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>kcfg_failedAutoRetryCount</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox24</cstring>
+ </property>
+ <property name="title">
+ <string>Other</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_queueOnDND</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Queue files (instead of transferring) when "dragged &amp;&amp; dropped"</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_skipEmptyDirs</cstring>
+ </property>
+ <property name="text">
+ <string>Skip &amp;empty directories when queueing</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>kcfg_confirmDisconnects</cstring>
+ </property>
+ <property name="text">
+ <string>Confirm disconnects &amp;before disconnecting</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>260</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.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>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/foobar.cpp b/kftpgrabber/src/ui/foobar.cpp
new file mode 100644
index 0000000..675490c
--- /dev/null
+++ b/kftpgrabber/src/ui/foobar.cpp
@@ -0,0 +1,19 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Jernej Kos *
+ * kostko@jweb-network.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#include "foobar.h"
+
+
+
+
+FooBar::~FooBar()
+{
+}
+
+
diff --git a/kftpgrabber/src/ui/foobar.h b/kftpgrabber/src/ui/foobar.h
new file mode 100644
index 0000000..9fa3619
--- /dev/null
+++ b/kftpgrabber/src/ui/foobar.h
@@ -0,0 +1,24 @@
+/***************************************************************************
+ * Copyright (C) 2003 by Jernej Kos *
+ * kostko@jweb-network.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#ifndef FOOBAR_H
+#define FOOBAR_H
+
+/**
+@author Jernej Kos
+*/
+class FooBar{
+public:
+
+
+ ~FooBar();
+
+};
+
+#endif
diff --git a/kftpgrabber/src/ui/kftpbookmarkeditortlswidget.ui b/kftpgrabber/src/ui/kftpbookmarkeditortlswidget.ui
new file mode 100644
index 0000000..56ed590
--- /dev/null
+++ b/kftpgrabber/src/ui/kftpbookmarkeditortlswidget.ui
@@ -0,0 +1,173 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KFTPBookmarkEditorTLSWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KFTPBookmarkEditorTLSWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>350</width>
+ <height>155</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</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="title">
+ <string>Data Connection Settings</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_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Mode:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>Always encrypt the data channel</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Encrypt only for directory listings</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Do not encrypt the data channel</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>tlsMode</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>X509 Certificate</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>useCert</cstring>
+ </property>
+ <property name="text">
+ <string>Use the following SSL certificate when connecting</string>
+ </property>
+ </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>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Path:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>certPath</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </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>41</width>
+ <height>181</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/kftpbookmarkimportlayout.ui b/kftpgrabber/src/ui/kftpbookmarkimportlayout.ui
new file mode 100644
index 0000000..e181881
--- /dev/null
+++ b/kftpgrabber/src/ui/kftpbookmarkimportlayout.ui
@@ -0,0 +1,280 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KFTPBookmarkImportLayout</class>
+<widget class="QWizard">
+ <property name="name">
+ <cstring>KFTPBookmarkImportLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>629</width>
+ <height>533</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Bookmark Import Wizard</string>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Step1</cstring>
+ </property>
+ <attribute name="title">
+ <string>Step 1: &lt;b&gt;Select Import Plugin&lt;/b&gt;</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_wizardPixmap</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>170</width>
+ <height>430</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Image</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Please select the appropriate import plugin from the list below. Each plugin can import from one different format.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Minimum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Available import plugins:</string>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_pluginList</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Step2</cstring>
+ </property>
+ <attribute name="title">
+ <string>Step 2: &lt;b&gt;Select Bookmark File to Import&lt;/b&gt;</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_wizardPixmap_2</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>170</width>
+ <height>430</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Image</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Please select the bookmark file from which you would like to import your bookmarks. A default path has already been determined by the import plugin.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Bookmark path:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_importUrl</cstring>
+ </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>31</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Step3</cstring>
+ </property>
+ <attribute name="title">
+ <string>Step 3: &lt;b&gt;Importing Bookmarks...&lt;/b&gt;</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_wizardPixmap_3</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>170</width>
+ <height>430</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Image</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Please wait while the bookmarks are being imported.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Import progress:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="KProgress">
+ <property name="name">
+ <cstring>m_progressBar</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer12</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>31</width>
+ <height>241</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kprogress.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/kftpfilteraddpatternlayout.ui b/kftpgrabber/src/ui/kftpfilteraddpatternlayout.ui
new file mode 100644
index 0000000..fe02996
--- /dev/null
+++ b/kftpgrabber/src/ui/kftpfilteraddpatternlayout.ui
@@ -0,0 +1,125 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KFTPFilterAddPatternLayout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KFTPFilterAddPatternLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>380</width>
+ <height>110</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>2</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="title">
+ <string>New Pattern</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Filename pattern:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Color:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>patName</cstring>
+ </property>
+ </widget>
+ <widget class="KColorButton">
+ <property name="name">
+ <cstring>patColor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kcolorbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/kftpqueueeditorlayout.ui b/kftpgrabber/src/ui/kftpqueueeditorlayout.ui
new file mode 100644
index 0000000..83ee815
--- /dev/null
+++ b/kftpgrabber/src/ui/kftpqueueeditorlayout.ui
@@ -0,0 +1,327 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KFTPQueueEditorLayout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KFTPQueueEditorLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>628</width>
+ <height>290</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="KLineEdit" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>dstPath</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>srcPath</cstring>
+ </property>
+ </widget>
+ <widget class="QTabWidget" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>serverTab</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Source Server Info</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Server Info</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Server name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Host:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ <widget class="KFTPServerLineEdit" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>srcName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>srcHost</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>srcUser</cstring>
+ </property>
+ </widget>
+ <widget class="KPasswordEdit" row="3" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>srcPass</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="3">
+ <property name="name">
+ <cstring>srcPort</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>21</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Destination Server Info</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1_2</cstring>
+ </property>
+ <property name="title">
+ <string>Server Info</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Server name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel5_2</cstring>
+ </property>
+ <property name="text">
+ <string>Host:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel7_2</cstring>
+ </property>
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel6_2</cstring>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ <widget class="KFTPServerLineEdit" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>dstName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>dstHost</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>dstUser</cstring>
+ </property>
+ </widget>
+ <widget class="KPasswordEdit" row="3" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>dstPass</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>textLabel8_2</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="3">
+ <property name="name">
+ <cstring>dstPort</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>21</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Source:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;Destination:&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Transfer type:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox" row="3" column="2">
+ <item>
+ <property name="text">
+ <string>Download</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Upload</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>FXP</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>transferType</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KFTPServerLineEdit</class>
+ <header location="local">kftpserverlineedit.h</header>
+ <sizehint>
+ <width>0</width>
+ <height>18</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>0</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>serverChanged(QDomNode server)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XBM.GZ" length="79">789c534e494dcbcc4b554829cdcdad8c2fcf4c29c95030e0524611cd48cd4ccf28010a1797249664262b2467241641a592324b8aa363156c15aab914146aadb90067111b1f</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpassdlg.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/kftpquickconnectlayout.ui b/kftpgrabber/src/ui/kftpquickconnectlayout.ui
new file mode 100644
index 0000000..03648e6
--- /dev/null
+++ b/kftpgrabber/src/ui/kftpquickconnectlayout.ui
@@ -0,0 +1,538 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KFTPQuickConnectLayout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KFTPQuickConnectLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>385</width>
+ <height>356</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32767</width>
+ <height>32766</height>
+ </size>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabWidget7</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;General</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Recent connections</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="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Select connection:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>recentConnections</cstring>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>clearRecent</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</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="title">
+ <string>Quick Connect</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="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>URL:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>urlBox</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter the whole url into this box</string>
+ </property>
+ </widget>
+ </hbox>
+ </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>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Host:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>hostBox</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter ftp's hostname</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>portBox</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="value">
+ <number>21</number>
+ </property>
+ </widget>
+ </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>textLabel4_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Protocol:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>FTP</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>FTP over TLS/SSL (explicit)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>FTP over TLS/SSL (implicit)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>SFTP over SSH2</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>protocolBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>protoAdvanced</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>anonLogin</cstring>
+ </property>
+ <property name="text">
+ <string>Anon&amp;ymous login</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Check for anonymous login</string>
+ </property>
+ </widget>
+ <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>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>usernameBox</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter account username</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ </widget>
+ <widget class="KPasswordEdit">
+ <property name="name">
+ <cstring>passwordBox</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Enter account password</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>addBookmark</cstring>
+ </property>
+ <property name="text">
+ <string>Add to &amp;bookmarks</string>
+ </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>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Advanced</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox14</cstring>
+ </property>
+ <property name="title">
+ <string>Server Encoding</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Encoding:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>serverEncoding</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <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>21</width>
+ <height>421</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<tabstops>
+ <tabstop>tabWidget7</tabstop>
+ <tabstop>urlBox</tabstop>
+ <tabstop>hostBox</tabstop>
+ <tabstop>portBox</tabstop>
+ <tabstop>protocolBox</tabstop>
+ <tabstop>protoAdvanced</tabstop>
+ <tabstop>anonLogin</tabstop>
+ <tabstop>usernameBox</tabstop>
+ <tabstop>passwordBox</tabstop>
+ <tabstop>addBookmark</tabstop>
+ <tabstop>serverEncoding</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpassdlg.h</includehint>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/ui/kftpsearchlayout.ui b/kftpgrabber/src/ui/kftpsearchlayout.ui
new file mode 100644
index 0000000..8c25300
--- /dev/null
+++ b/kftpgrabber/src/ui/kftpsearchlayout.ui
@@ -0,0 +1,245 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KFTPSearchLayout</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KFTPSearchLayout</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>550</width>
+ <height>409</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>500</width>
+ <height>400</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Queue Search &amp; Replace</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Using this dialog, you can do massive replacing of source/destination paths of the queued transfers. &lt;b&gt;Changes cannot be undone.&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Search What</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Destination:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Source:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>searchServer</cstring>
+ </property>
+ <property name="text">
+ <string>Search only for transfers on specific server</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="title">
+ <string>Server Info</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Server name:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Host:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="text">
+ <string>Password:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ <widget class="KFTPServerLineEdit" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>searchServerName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>searchServerHost</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>searchServerUser</cstring>
+ </property>
+ </widget>
+ <widget class="KPasswordEdit" row="3" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>searchServerPass</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="3">
+ <property name="name">
+ <cstring>searchServerPort</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>21</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>searchSrcPath</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>searchDstPath</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3_2</cstring>
+ </property>
+ <property name="title">
+ <string>Replace With</string>
+ </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>Destination:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Source:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>replaceSrcPath</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>replaceDstPath</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>KFTPServerLineEdit</class>
+ <header location="local">widgets/kftpserverlineedit.h</header>
+ <sizehint>
+ <width>0</width>
+ <height>18</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>0</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ <signal>serverChanged(QDomNode server)</signal>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XBM.GZ" length="79">789c534e494dcbcc4b554829cdcdad8c2fcf4c29c95030e0524611cd48cd4ccf28010a1797249664262b2467241641a592324b8aa363156c15aab914146aadb90067111b1f</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpassdlg.h</includehint>
+</includehints>
+</UI>
diff --git a/kftpgrabber/src/widgets/Makefile.am b/kftpgrabber/src/widgets/Makefile.am
new file mode 100644
index 0000000..fa99f84
--- /dev/null
+++ b/kftpgrabber/src/widgets/Makefile.am
@@ -0,0 +1,28 @@
+INCLUDES = -I$(srcdir)/.. \
+ -I$(srcdir)/../engine \
+ -I$(srcdir)/../misc \
+ -I$(srcdir)/../widgets/browser \
+ -I.. \
+ -I../ui \
+ $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES =
+noinst_LIBRARIES = libwidgets.a
+libwidgets_a_SOURCES = logview.cpp kftpselectserverdialog.cpp \
+ kftpselectserverdialog.h kftpserverlineedit.cpp kftpserverlineedit.h listview.cpp \
+ quickconnect.cpp systemtray.cpp balloon.cpp searchdialog.cpp \
+ kftpzeroconflistview.cpp trafficgraph.cpp kftptabwidget.cpp failedtransfers.cpp \
+ listviewitem.cpp sidebar.cpp multitabbar.cpp configdialog.cpp \
+ configfilter.cpp verifier.cpp filtereditor.cpp widgetlister.cpp overlaywidget.cpp \
+ popupmessage.cpp
+
+SUBDIRS = queueview browser bookmarks
+
+noinst_HEADERS = listview.h quickconnect.h systemtray.h searchdialog.h \
+ kftpzeroconflistview.h trafficgraph.h kftptabwidget.h \
+ logview.h failedtransfers.h listviewitem.h sidebar.h multitabbar.h \
+ multitabbar_p.h configdialog.h configfilter.h verifier.h balloon.h filtereditor.h \
+ widgetlister.h overlaywidget.h popupmessage.h
+
diff --git a/kftpgrabber/src/widgets/balloon.cpp b/kftpgrabber/src/widgets/balloon.cpp
new file mode 100644
index 0000000..eb10432
--- /dev/null
+++ b/kftpgrabber/src/widgets/balloon.cpp
@@ -0,0 +1,145 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <qpointarray.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <kapplication.h>
+#include <kdialog.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kactivelabel.h>
+#include <kglobalsettings.h>
+
+#include "widgets/balloon.h"
+#include "misc.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+Balloon::Balloon(const QString &text, const QString &pix)
+ : QWidget(0L, "KFTPBalloon", WStyle_StaysOnTop | WStyle_Customize | WStyle_NoBorder | WStyle_Tool | WX11BypassWM)
+{
+ setCaption("");
+
+ QVBoxLayout *BalloonLayout = new QVBoxLayout(this, 22, KDialog::spacingHint(), "BalloonLayout");
+
+ // BEGIN Layout1
+ QHBoxLayout *Layout1 = new QHBoxLayout(BalloonLayout, KDialog::spacingHint(), "Layout1");
+ KActiveLabel *caption = new KActiveLabel(text, this, "caption");
+ caption->setPalette(QToolTip::palette());
+ caption->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+
+ if (!pix.isEmpty()) {
+ QLabel *image = new QLabel(this, "mImage");
+ image->setScaledContents(FALSE);
+ image->setPixmap(loadSmallPixmap(pix));
+
+ Layout1->addWidget(image);
+ }
+
+ Layout1->addWidget(caption);
+ // END Layout1
+
+ setPalette(QToolTip::palette());
+ setAutoMask(true);
+
+ connect(caption, SIGNAL(clicked(int, int)), this, SIGNAL(signalBalloonClicked()));
+ connect(caption, SIGNAL(linkClicked(const QString &)), this, SIGNAL(signalIgnoreButtonClicked()));
+ connect(caption, SIGNAL(linkClicked(const QString &)), this, SLOT(deleteLater()));
+}
+
+void Balloon::mousePressEvent(QMouseEvent *e)
+{
+ emit signalBalloonClicked();
+ e->accept();
+}
+
+void Balloon::setAnchor(const QPoint &anchor)
+{
+ m_anchor = anchor;
+ updateMask();
+}
+
+void Balloon::updateMask()
+{
+ QRegion mask(10, 10, width() - 20, height() - 20);
+
+ QPoint corners[8] = {
+ QPoint(width() - 50, 10),
+ QPoint(10, 10),
+ QPoint(10, height() - 50),
+ QPoint(width() - 50, height() - 50),
+ QPoint(width() - 10, 10),
+ QPoint(10, 10),
+ QPoint(10, height() - 10),
+ QPoint(width() - 10, height() - 10)
+ };
+
+ for (int i = 0; i < 4; ++i) {
+ QPointArray corner;
+ corner.makeArc(corners[i].x(), corners[i].y(), 40, 40, i * 16 * 90, 16 * 90);
+ corner.resize(corner.size() + 1);
+ corner.setPoint(corner.size() - 1, corners[i + 4]);
+ mask -= corner;
+ }
+
+ // get screen-geometry for screen our anchor is on
+ // (geometry can differ from screen to screen!)
+ QRect deskRect = KGlobalSettings::desktopGeometry(m_anchor);
+
+ bool bottom = (m_anchor.y() + height()) > (deskRect.height() - 48);
+ bool right = (m_anchor.x() + width()) > (deskRect.width() - 48);
+
+ QPointArray arrow(4);
+ arrow.setPoint(0, QPoint(right ? width() : 0, bottom ? height() : 0));
+ arrow.setPoint(1, QPoint(right ? width() - 10 : 10, bottom ? height() - 30 : 30));
+ arrow.setPoint(2, QPoint(right ? width() - 30 : 30, bottom ? height() - 10 : 10));
+ arrow.setPoint(3, arrow[0]);
+ mask += arrow;
+ setMask(mask);
+
+ move(right ? m_anchor.x() - width() : m_anchor.x(), bottom ? m_anchor.y() - height() : m_anchor.y());
+}
+
+}
+
+#include "balloon.moc"
+
diff --git a/kftpgrabber/src/widgets/balloon.h b/kftpgrabber/src/widgets/balloon.h
new file mode 100644
index 0000000..c123ae7
--- /dev/null
+++ b/kftpgrabber/src/widgets/balloon.h
@@ -0,0 +1,86 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSBALLOON_H
+#define KFTPWIDGETSBALLOON_H
+
+#include <qwidget.h>
+
+namespace KFTPWidgets {
+
+/**
+ * A little balloon for notifications taken from Kopete with some modifications
+ * for KFTPGrabber.
+ *
+ * @author Malte Starostik <malte@kde.org>
+ * @author Duncan Mac-Vicar Prett <duncan@kde.org>
+ */
+class Balloon : public QWidget
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param text The text to display inside the balloon
+ * @param pic Name of the pixmap to display inside the balloon
+ */
+ Balloon(const QString &text, const QString &pic);
+
+ /**
+ * Set widget anchor.
+ *
+ * @param anchor Anchor coordinates
+ */
+ void setAnchor(const QPoint &anchor);
+
+ /**
+ * Intercept mouse press events.
+ */
+ void mousePressEvent(QMouseEvent *e);
+signals:
+ void signalButtonClicked();
+ void signalIgnoreButtonClicked();
+ void signalBalloonClicked();
+protected:
+ void updateMask();
+private:
+ QPoint m_anchor;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/bookmarks/Makefile.am b/kftpgrabber/src/widgets/bookmarks/Makefile.am
new file mode 100644
index 0000000..d735a01
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/Makefile.am
@@ -0,0 +1,13 @@
+INCLUDES = -I$(top_builddir)/kftpgrabber/src \
+ -I$(srcdir)/../.. \
+ -I$(srcdir)/../../engine \
+ -I$(srcdir)/../../misc \
+ -I$(srcdir)/../../widgets \
+ -I$(srcdir)/../../widgets/browser \
+ -I$(srcdir)/../../ui \
+ -I$(top_builddir)/kftpgrabber/src/ui \
+ $(all_includes)
+METASOURCES = AUTO
+noinst_LIBRARIES = libbookmarkwidgets.a
+noinst_HEADERS = editor.h editortls.h listview.h importwizard.h sidebar.h
+libbookmarkwidgets_a_SOURCES = editor.cpp editortls.cpp listview.cpp importwizard.cpp sidebar.cpp
diff --git a/kftpgrabber/src/widgets/bookmarks/editor.cpp b/kftpgrabber/src/widgets/bookmarks/editor.cpp
new file mode 100644
index 0000000..88ba05c
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/editor.cpp
@@ -0,0 +1,492 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qspinbox.h>
+#include <qsplitter.h>
+#include <qtextedit.h>
+#include <qtabwidget.h>
+
+#include <kglobal.h>
+#include <kcharsets.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <kpassdlg.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kcombobox.h>
+#include <kurlrequester.h>
+#include <kguiitem.h>
+#include <kfiledialog.h>
+#include <kio/job.h>
+
+#include "kftpapi.h"
+#include "kftpbookmarks.h"
+#include "misc/config.h"
+#include "misc.h"
+
+#include "editor.h"
+#include "listview.h"
+#include "importwizard.h"
+#include "editortls.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+KActionCollection *BookmarkEditor::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+BookmarkEditor::BookmarkEditor(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, "FTP Bookmark Editor", User2|User1|Ok|Apply|Cancel, Ok, true, KGuiItem(i18n("Import...")), KGuiItem(i18n("Export..."))),
+ m_activeSite(0),
+ m_activeItem(0L),
+ m_portChanged(false)
+{
+ // We operate on a copy of the bookmarks
+ m_bookmarks = new KFTPBookmarks::Manager(*KFTPBookmarks::Manager::self());
+
+ QHBoxLayout *winLayout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ QSplitter *splitter = new QSplitter(this);
+ setMainWidget(splitter);
+ winLayout->addWidget(splitter);
+
+ // Create the list view for editing bookmarks
+ m_tree = new ListView(m_bookmarks, splitter);
+
+ m_properties = new BookmarkProperties(splitter);
+
+ initDialog();
+
+ connect(this, SIGNAL(user1Clicked()), this, SLOT(slotImportWizard()));
+ connect(this, SIGNAL(user2Clicked()), this, SLOT(slotExportWizard()));
+
+ connect(m_tree, SIGNAL(bookmarkClicked(QListViewItem*)), this, SLOT(slotTreeClicked(QListViewItem*)));
+ connect(m_tree, SIGNAL(bookmarkNew(ListViewItem*, KFTPBookmarks::Site*)), this, SLOT(slotNewAction(ListViewItem*, KFTPBookmarks::Site*)));
+ connect(m_tree, SIGNAL(bookmarkDuplicated(ListViewItem*, KFTPBookmarks::Site*)), this, SLOT(slotDuplicateAction(ListViewItem*, KFTPBookmarks::Site*)));
+ connect(m_tree, SIGNAL(bookmarkDeleted()), this, SLOT(slotDeleteAction()));
+ connect(m_tree, SIGNAL(bookmarkMoved()), this, SLOT(refresh()));
+ connect(m_tree, SIGNAL(categoryRenamed()), this, SLOT(refresh()));
+
+ // Get the new bookmark data
+ m_tree->fillBookmarkData();
+}
+
+BookmarkEditor::BookmarkEditor(ListViewItem *item, QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n("FTP Bookmark Editor"), Ok|Apply|Cancel, Ok, true),
+ m_activeSite(0),
+ m_activeItem(item),
+ m_tree(0L),
+ m_portChanged(false)
+{
+ setCaption(m_activeItem->text(0));
+
+ // We operate on a copy of the bookmarks
+ m_bookmarks = new KFTPBookmarks::Manager(*KFTPBookmarks::Manager::self());
+
+ QHBoxLayout *winLayout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ m_properties = new BookmarkProperties(this);
+ setMainWidget(m_properties);
+ winLayout->addWidget(m_properties);
+
+ initDialog();
+
+ m_activeSite = m_activeItem->m_site;
+
+ showActiveNode();
+}
+
+BookmarkEditor::~BookmarkEditor()
+{
+ delete m_bookmarks;
+}
+
+void BookmarkEditor::initDialog()
+{
+ m_properties->tabList->setTabIconSet(m_properties->general, loadSmallIcon("kfm"));
+ m_properties->tabList->setTabIconSet(m_properties->advanced, loadSmallIcon("contents"));
+ m_properties->tabList->setTabIconSet(m_properties->keepalive, loadSmallIcon("clock"));
+ m_properties->protoAdvanced->setIconSet(loadSmallIcon("configure"));
+ m_properties->retryGroup->setEnabled(false);
+ m_properties->defLocalDir->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly );
+
+ connect(m_properties->anonLogin, SIGNAL(clicked()), this, SLOT(slotChangeAnonLogin()));
+ connect(m_properties->doRetry, SIGNAL(clicked()), this, SLOT(slotChangeActiveRetryGroup()));
+ connect(m_properties->doKeepalive, SIGNAL(clicked()), this, SLOT(slotChangeActiveKeepaliveGroup()));
+ connect(m_properties->protoAdvanced, SIGNAL(clicked()), this, SLOT(slotProtoAdvancedClicked()));
+ connect(m_properties->serverProtocol, SIGNAL(activated(int)), this, SLOT(slotChangeServerProtocol(int)));
+ connect(m_properties->serverPort, SIGNAL(valueChanged(int)), this, SLOT(slotPortChanged()));
+
+ connect(this, SIGNAL(applyClicked()), this, SLOT(slotSaveActiveNode()));
+ connect(this, SIGNAL(okClicked()), this, SLOT(slotSaveActiveNode()));
+
+ // Populate charsets
+ QStringList charsets = KGlobal::charsets()->descriptiveEncodingNames();
+ m_properties->serverEncoding->insertStringList(charsets);
+
+ // Deactivate everything until an item gets selected
+ m_properties->setEnabled(false);
+}
+
+void BookmarkEditor::refresh()
+{
+ m_tree->clear();
+ m_tree->fillBookmarkData();
+}
+
+void BookmarkEditor::slotImportWizard()
+{
+ ImportWizard *wizard = new ImportWizard(this);
+
+ if (wizard->exec() == QDialog::Accepted) {
+ // Refresh bookmarks
+ m_bookmarks->setBookmarks(KFTPBookmarks::Manager::self());
+
+ m_tree->clear();
+ m_tree->fillBookmarkData();
+ }
+
+ delete wizard;
+}
+
+void BookmarkEditor::slotExportWizard()
+{
+ if (KMessageBox::questionYesNo(0, i18n("<qt>You are about to export your KFTPGrabber bookmarks. They may contain passwords or sensitive X509 certificates; exporting your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"), i18n("Export Bookmarks")) == KMessageBox::No) {
+ return;
+ }
+
+ QString savePath = KFileDialog::getSaveFileName(QString::null, "*.xml|KFTPGrabber Bookmarks", 0, i18n("Export Bookmarks"));
+
+ if (!savePath.isEmpty()) {
+ // Save and copy the bookmarks
+ KFTPBookmarks::Manager::self()->save();
+ KIO::copy(KURL(getStoreDir("bookmarks.xml")), KURL(savePath), false);
+ }
+}
+
+void BookmarkEditor::slotNewAction(ListViewItem *item, KFTPBookmarks::Site *site)
+{
+ // Display the new server's properties
+ m_activeItem = item;
+ m_activeSite = site;
+
+ showActiveNode();
+
+ // Set Focus to servername
+ m_properties->serverName->selectAll();
+ m_properties->serverName->setFocus();
+}
+
+void BookmarkEditor::slotDuplicateAction(ListViewItem *item, KFTPBookmarks::Site *site)
+{
+ m_activeItem = item;
+
+ // Display its properties
+ m_activeSite = site;
+
+ showActiveNode();
+}
+
+void BookmarkEditor::slotDeleteAction()
+{
+ m_activeItem = 0L;
+ m_properties->setEnabled(false);
+}
+
+void BookmarkEditor::slotSaveActiveNode()
+{
+ if (!m_activeItem) {
+ KFTPBookmarks::Manager::self()->setBookmarks(m_bookmarks);
+ return;
+ }
+
+ m_activeSite->setAttribute("name", m_properties->serverName->text());
+ m_activeSite->setProperty("host", m_properties->serverAddress->text());
+ m_activeSite->setProperty("port", m_properties->serverPort->value());
+ m_activeSite->setProperty("protocol", m_properties->serverProtocol->currentItem() == SP_SFTP ? "sftp" : "ftp");
+ m_activeSite->setProperty("use_tls", m_properties->serverProtocol->currentItem() == SP_SSL_EXPLICIT);
+ m_activeSite->setProperty("use_implicit", m_properties->serverProtocol->currentItem() == SP_SSL_IMPLICIT);
+ m_activeSite->setProperty("anonlogin", m_properties->anonLogin->isChecked());
+
+ m_activeSite->setProperty("username", m_properties->downUser->text());
+ m_activeSite->setProperty("password", encodePassword(m_properties->downPass->password()));
+
+ m_activeSite->setProperty("encoding", KGlobal::charsets()->encodingForName(m_properties->serverEncoding->currentText()));
+
+ // Only save the local dir if it differs from the default one
+ if (m_properties->defLocalDir->url() != KFTPCore::Config::defLocalDir())
+ m_activeSite->setProperty("deflocalpath", m_properties->defLocalDir->url());
+
+ m_activeSite->setProperty("defremotepath", m_properties->defRemoteDir->text());
+ m_activeSite->setProperty("description", m_properties->description->text());
+
+ m_activeSite->setProperty("doRetry", m_properties->doRetry->isChecked());
+ m_activeSite->setProperty("retrytime", m_properties->retryDelay->value());
+ m_activeSite->setProperty("retrycount", m_properties->retryCount->value());
+
+ m_activeSite->setProperty("doKeepalive", m_properties->doKeepalive->isChecked());
+ m_activeSite->setProperty("keepaliveTimeout", m_properties->keepaliveTimeout->value());
+
+ m_activeSite->setProperty("disablePASV", m_properties->disablePASV->isChecked());
+ m_activeSite->setProperty("disableEPSV", m_properties->disableEPSV->isChecked());
+ m_activeSite->setProperty("pasvSiteIp", m_properties->pasvSiteIp->isChecked());
+ m_activeSite->setProperty("disableForceIp", m_properties->disableForceIp->isChecked());
+ m_activeSite->setProperty("disableThreads", m_properties->threadsDisable->isChecked());
+ m_activeSite->setProperty("statListings", m_properties->statListings->isChecked());
+
+ // Update the ListView node
+ m_activeItem->setText(0, m_properties->serverName->text());
+
+ if (m_tree)
+ KFTPBookmarks::Manager::self()->setBookmarks(m_bookmarks);
+
+ showActiveNode();
+
+ // Save the bookmarks
+ KFTPBookmarks::Manager::self()->save();
+}
+
+void BookmarkEditor::showActiveNode()
+{
+ if (m_activeItem->m_type == BT_CATEGORY || !m_activeSite) {
+ m_properties->setEnabled(false);
+ return;
+ }
+
+ m_properties->setEnabled(true);
+
+ // Show all the data for the active node
+ m_properties->serverName->setText(m_activeSite->getAttribute("name"));
+ m_properties->serverAddress->setText(m_activeSite->getProperty("host"));
+
+ if (m_activeSite->getProperty("protocol") == "sftp") m_properties->serverProtocol->setCurrentItem(SP_SFTP);
+ else if (m_activeSite->getIntProperty("use_tls")) m_properties->serverProtocol->setCurrentItem(SP_SSL_EXPLICIT);
+ else if (m_activeSite->getIntProperty("use_implicit")) m_properties->serverProtocol->setCurrentItem(SP_SSL_IMPLICIT);
+ else m_properties->serverProtocol->setCurrentItem(SP_FTP);
+
+ slotChangeServerProtocol(m_properties->serverProtocol->currentItem());
+
+
+ m_properties->serverPort->setValue(m_activeSite->getIntProperty("port"));
+ m_portChanged = false;
+
+ m_properties->downUser->erase();
+ m_properties->downPass->erase();
+ m_properties->anonLogin->setChecked(m_activeSite->getIntProperty("anonlogin"));
+
+ slotChangeAnonLogin();
+
+ m_properties->downUser->setText(m_activeSite->getProperty("username"));
+ m_properties->downPass->insert(m_activeSite->getProperty("password"));
+
+ QString defLocalPath = m_activeSite->getProperty("deflocalpath");
+ if (defLocalPath.isEmpty())
+ defLocalPath = KFTPCore::Config::defLocalDir();
+
+ m_properties->defLocalDir->setURL(defLocalPath);
+ m_properties->defRemoteDir->setText(m_activeSite->getProperty("defremotepath"));
+ m_properties->description->setText(m_activeSite->getProperty("description"));
+
+ int retryTime = m_activeSite->getIntProperty("retrytime");
+ int retryCount = m_activeSite->getIntProperty("retrycount");
+
+ m_properties->doRetry->setChecked(m_activeSite->getIntProperty("doRetry"));
+
+ if (m_properties->doRetry->isChecked()) {
+ m_properties->retryGroup->setEnabled(true);
+ m_properties->retryDelay->setValue(retryTime);
+ m_properties->retryCount->setValue(retryCount);
+ } else {
+ m_properties->retryGroup->setEnabled(false);
+ m_properties->retryDelay->setValue(KFTPCore::Config::retryTime());
+ m_properties->retryCount->setValue(KFTPCore::Config::retryCount());
+ }
+
+ m_properties->doKeepalive->setChecked(m_activeSite->getIntProperty("doKeepalive"));
+
+ if (m_properties->doKeepalive->isChecked()) {
+ m_properties->keepaliveGroup->setEnabled(true);
+ m_properties->keepaliveTimeout->setValue(m_activeSite->getIntProperty("keepaliveTimeout"));
+ } else {
+ m_properties->keepaliveGroup->setEnabled(false);
+ m_properties->keepaliveTimeout->setValue(60);
+ }
+
+ QString serverEncoding = m_activeSite->getProperty("encoding");
+ if (serverEncoding.isEmpty())
+ serverEncoding = KFTPCore::Config::defEncoding();
+
+ serverEncoding = QString("%1 ( %2 )").arg(KGlobal::charsets()->languageForEncoding(serverEncoding)).arg(serverEncoding);
+ m_properties->serverEncoding->setCurrentText(serverEncoding);
+
+ m_properties->disablePASV->setChecked(m_activeSite->getIntProperty("disablePASV"));
+ m_properties->disableEPSV->setChecked(m_activeSite->getIntProperty("disableEPSV"));
+ m_properties->pasvSiteIp->setChecked(m_activeSite->getIntProperty("pasvSiteIp"));
+ m_properties->disableForceIp->setChecked(m_activeSite->getIntProperty("disableForceIp"));
+ m_properties->threadsDisable->setChecked(m_activeSite->getIntProperty("disableThreads"));
+ m_properties->statListings->setChecked(m_activeSite->getIntProperty("statListings"));
+}
+
+void BookmarkEditor::slotTreeClicked(QListViewItem *item)
+{
+ m_activeItem = static_cast<ListViewItem*>(item);
+
+ if ( !m_activeItem || m_activeItem->m_type == BT_CATEGORY ) {
+ // Deactivate all controls
+ m_properties->setEnabled(false);
+ return;
+ }
+
+ // Find the node and set it active
+ if (m_activeItem->m_type == BT_CATEGORY) {
+ // Category
+ m_activeSite = 0L;
+ } else {
+ // Server
+ m_activeSite = m_activeItem->m_site;
+ }
+
+ // Show the active node (if any)
+ showActiveNode();
+}
+
+void BookmarkEditor::slotChangeActiveRetryGroup()
+{
+ m_properties->retryGroup->setEnabled(m_properties->doRetry->isChecked());
+}
+
+void BookmarkEditor::slotChangeActiveKeepaliveGroup()
+{
+ m_properties->keepaliveGroup->setEnabled(m_properties->doKeepalive->isChecked());
+}
+
+void BookmarkEditor::slotChangeAnonLogin()
+{
+ static QString tmpUser, tmpPass;
+
+ if (m_properties->anonLogin->isChecked()) {
+ m_properties->downUser->setEnabled(false);
+ m_properties->downPass->setEnabled(false);
+ tmpUser = m_properties->downUser->text();
+ tmpPass = m_properties->downPass->text();
+ m_properties->downUser->setText("anonymous");
+
+ // Use the appropriate e-mail address for anonymous accounts
+ if (!KFTPCore::Config::anonMail().isEmpty())
+ m_properties->downPass->setText(KFTPCore::Config::anonMail());
+ else
+ m_properties->downPass->setText("userlogin@anonymo.us");
+ } else {
+ m_properties->downUser->setEnabled(true);
+ m_properties->downPass->setEnabled(true);
+ m_properties->downUser->setText(tmpUser);
+ m_properties->downPass->setText(tmpPass);
+ }
+}
+
+void BookmarkEditor::slotProtoAdvancedClicked()
+{
+ BookmarkEditorTLS *tlsDialog = new BookmarkEditorTLS(this);
+
+ // Initialize dialog
+ int mode = m_activeSite->getIntProperty("tls_data_mode");
+ bool useCert = m_activeSite->getIntProperty("use_cert");
+ QString certPath = m_activeSite->getProperty("tls_cert_path");
+
+ tlsDialog->setTLSMode(mode);
+ tlsDialog->setCertChecked(useCert);
+ if (useCert)
+ tlsDialog->setCertPath(certPath);
+ tlsDialog->slotChangeActiveX509Group();
+
+ if (tlsDialog->exec()) {
+ // Save the modifications
+ m_activeSite->setProperty("tls_data_mode", tlsDialog->getTLSMode());
+ m_activeSite->setProperty("use_cert", tlsDialog->isCertChecked());
+
+ if (tlsDialog->isCertChecked())
+ m_activeSite->setProperty("tls_cert_path", tlsDialog->getCertPath());
+ }
+
+ delete tlsDialog;
+}
+
+void BookmarkEditor::slotPortChanged()
+{
+ m_portChanged = true;
+}
+
+void BookmarkEditor::slotChangeServerProtocol(int item)
+{
+ // Enable/Disable the SSL/TLS settings if needed
+ m_properties->protoAdvanced->setEnabled( item == 1 || item == 2 );
+
+ // Set the default port
+ if (!m_portChanged) {
+ switch (item) {
+ case SP_SSL_IMPLICIT:
+ if (m_properties->serverPort->value() == 21 || m_properties->serverPort->value() == 22)
+ m_properties->serverPort->setValue(993);
+ break;
+ case SP_SFTP:
+ if (m_properties->serverPort->value() == 21 || m_properties->serverPort->value() == 993)
+ m_properties->serverPort->setValue(22);
+ break;
+ default:
+ if (m_properties->serverPort->value() == 22 || m_properties->serverPort->value() == 993)
+ m_properties->serverPort->setValue(21);
+ break;
+ }
+
+ m_portChanged = false;
+ }
+}
+
+}
+
+}
+
+#include "editor.moc"
diff --git a/kftpgrabber/src/widgets/bookmarks/editor.h b/kftpgrabber/src/widgets/bookmarks/editor.h
new file mode 100644
index 0000000..50b04aa
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/editor.h
@@ -0,0 +1,133 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKEDITOR_H
+#define KFTPBOOKMARKEDITOR_H
+
+#include "ui/bookmark_properties.h"
+
+#include <kaction.h>
+#include <kdialogbase.h>
+
+#include <qlistview.h>
+#include <qdom.h>
+
+namespace KFTPBookmarks {
+ class Manager;
+ class Site;
+}
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+class ListViewItem;
+class ListView;
+
+/**
+@author Jernej Kos
+*/
+class BookmarkEditor : public KDialogBase
+{
+Q_OBJECT
+public:
+ BookmarkEditor(QWidget *parent = 0, const char *name = 0);
+ BookmarkEditor(ListViewItem *item, QWidget *parent = 0, const char *name = 0);
+ ~BookmarkEditor();
+private:
+ enum BookmarkType {
+ BT_CATEGORY = 0,
+ BT_SERVER
+ };
+
+ enum ServerProtocol {
+ SP_FTP = 0,
+ SP_SSL_EXPLICIT,
+ SP_SSL_IMPLICIT,
+ SP_SFTP
+ };
+
+ KFTPBookmarks::Manager *m_bookmarks;
+ KFTPBookmarks::Site *m_activeSite;
+
+ ListViewItem *m_activeItem;
+
+ BookmarkProperties *m_properties;
+ ListView *m_tree;
+
+ bool m_portChanged;
+
+ /* Actions */
+ KAction *m_newAction;
+ KAction *m_renameAction;
+ KAction *m_deleteAction;
+ KAction *m_subCatAction;
+ KAction *m_copyAction;
+ KActionCollection *actionCollection();
+
+ // Some common stuff for the constructors
+ void initDialog();
+
+ void showActiveNode();
+public slots:
+ void refresh();
+private slots:
+ /* Action slots */
+ void slotNewAction(ListViewItem *item, KFTPBookmarks::Site *site);
+ void slotDeleteAction();
+ void slotDuplicateAction(ListViewItem *item, KFTPBookmarks::Site *site);
+
+ /* Other slots */
+ void slotChangeAnonLogin();
+ void slotProtoAdvancedClicked();
+ void slotChangeActiveRetryGroup();
+ void slotChangeActiveKeepaliveGroup();
+ void slotChangeServerProtocol(int item);
+ void slotPortChanged();
+
+ void slotTreeClicked(QListViewItem *item);
+
+ void slotImportWizard();
+ void slotExportWizard();
+
+ void slotSaveActiveNode();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/bookmarks/editortls.cpp b/kftpgrabber/src/widgets/bookmarks/editortls.cpp
new file mode 100644
index 0000000..c299288
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/editortls.cpp
@@ -0,0 +1,115 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <qcheckbox.h>
+
+#include <kcombobox.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+
+#include "kftpapi.h"
+#include "editortls.h"
+#include "kftpbookmarkeditortlswidget.h"
+#include "misc.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+KActionCollection *BookmarkEditorTLS::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+BookmarkEditorTLS::BookmarkEditorTLS(QWidget *parent, const char *name)
+ : KDialogBase(parent, name)
+{
+ m_mainWidget = new KFTPBookmarkEditorTLSWidget(this);
+ setMainWidget(m_mainWidget);
+
+ setCaption(i18n("SSL/TLS Settings"));
+ showButtonApply(false);
+
+ connect(m_mainWidget->useCert, SIGNAL(clicked()), this, SLOT(slotChangeActiveX509Group()));
+}
+
+BookmarkEditorTLS::~BookmarkEditorTLS()
+{
+ delete m_mainWidget;
+}
+
+void BookmarkEditorTLS::slotChangeActiveX509Group()
+{
+ m_mainWidget->certPath->setEnabled(m_mainWidget->useCert->isChecked());
+}
+
+int BookmarkEditorTLS::getTLSMode()
+{
+ return m_mainWidget->tlsMode->currentItem();
+}
+
+bool BookmarkEditorTLS::isCertChecked()
+{
+ return m_mainWidget->useCert->isChecked();
+}
+
+QString BookmarkEditorTLS::getCertPath()
+{
+ return m_mainWidget->certPath->url();
+}
+
+void BookmarkEditorTLS::setTLSMode(int mode)
+{
+ m_mainWidget->tlsMode->setCurrentItem(mode);
+}
+
+void BookmarkEditorTLS::setCertChecked(const bool checked)
+{
+ m_mainWidget->useCert->setChecked(checked);
+}
+
+void BookmarkEditorTLS::setCertPath(const QString &path)
+{
+ m_mainWidget->certPath->setURL(path);
+}
+
+}
+
+}
+
+#include "editortls.moc"
diff --git a/kftpgrabber/src/widgets/bookmarks/editortls.h b/kftpgrabber/src/widgets/bookmarks/editortls.h
new file mode 100644
index 0000000..3325946
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/editortls.h
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKEDITORTLS_H
+#define KFTPBOOKMARKEDITORTLS_H
+
+#include "editor.h"
+#include "kftpbookmarkeditortlswidget.h"
+
+#include <kaction.h>
+#include <kdialogbase.h>
+
+#include <qlistview.h>
+#include <qdom.h>
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+/**
+@author Jernej Kos
+*/
+class BookmarkEditorTLS : public KDialogBase
+{
+Q_OBJECT
+public:
+ BookmarkEditorTLS(QWidget *parent = 0, const char *name = 0);
+ ~BookmarkEditorTLS();
+
+ int getTLSMode();
+ bool isCertChecked();
+ QString getCertPath();
+
+ void setTLSMode(int mode);
+ void setCertChecked(const bool checked);
+ void setCertPath(const QString &path);
+private:
+ QDomNode m_activeNode;
+ QDomNode m_activeCategory;
+
+ KFTPBookmarkEditorTLSWidget *m_mainWidget;
+
+ KActionCollection *actionCollection();
+public slots:
+ void slotChangeActiveX509Group();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/bookmarks/importwizard.cpp b/kftpgrabber/src/widgets/bookmarks/importwizard.cpp
new file mode 100644
index 0000000..aa30bee
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/importwizard.cpp
@@ -0,0 +1,167 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "importwizard.h"
+#include "kftpapi.h"
+#include "kftppluginmanager.h"
+#include "interfaces/kftpbookmarkimportplugin.h"
+#include "misc.h"
+#include "kftpbookmarks.h"
+
+#include <qfileinfo.h>
+#include <qlabel.h>
+
+#include <kurlrequester.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kprogress.h>
+#include <kstandarddirs.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+PluginListItem::PluginListItem(KListView *parent, KService::Ptr service)
+ : KListViewItem(parent, service->name(), service->comment()), m_service(service)
+{
+ setPixmap(0, loadSmallPixmap("filter"));
+}
+
+ImportWizard::ImportWizard(QWidget *parent, const char *name)
+ : KFTPBookmarkImportLayout(parent, name)
+{
+ m_pluginList->setFullWidth(true);
+ m_pluginList->setAllColumnsShowFocus(true);
+
+ connect(m_pluginList, SIGNAL(clicked(QListViewItem*)), this, SLOT(slotPluginsSelectionChanged(QListViewItem*)));
+
+ setNextEnabled(Step1, false);
+
+ // Set pixmap
+ QString pixmapPath = locate("appdata", "kftpgrabber-bi-wizard.png");
+ if (!pixmapPath.isNull()) {
+ QPixmap pix(pixmapPath);
+
+ m_wizardPixmap->setPixmap(pix);
+ m_wizardPixmap_2->setPixmap(pix);
+ m_wizardPixmap_3->setPixmap(pix);
+ }
+
+ // Disable useless help buttons
+ setHelpEnabled(Step1, false);
+ setHelpEnabled(Step2, false);
+ setHelpEnabled(Step3, false);
+
+ displayPluginList();
+}
+
+void ImportWizard::next()
+{
+ if (currentPage() == Step1) {
+ // Load the plugin
+ m_plugin = KFTPAPI::getInstance()->pluginManager()->loadImportPlugin(m_service);
+
+ if (!m_plugin) {
+ KMessageBox::error(0, i18n("Unable to load the selected import plugin."));
+ return;
+ } else {
+ // Get the default plugin path
+ m_importUrl->setURL("~/" + m_plugin->getDefaultPath());
+ }
+ } else if (currentPage() == Step2) {
+ // Check if the file exists
+ if (!QFileInfo(m_importUrl->url()).exists() || !QFileInfo(m_importUrl->url()).isReadable()) {
+ KMessageBox::error(0, i18n("The selected file does not exist or is not readable."));
+ return;
+ }
+ }
+
+ QWizard::next();
+
+ if (currentPage() == Step3) {
+ // Start the import
+ setBackEnabled(Step3, false);
+
+ connect(m_plugin, SIGNAL(progress(int)), this, SLOT(slotImportProgress(int)));
+ m_plugin->import(m_importUrl->url());
+ }
+}
+
+void ImportWizard::slotImportProgress(int progress)
+{
+ m_progressBar->setProgress(progress);
+
+ if (progress == 100) {
+ // Import complete
+ KMessageBox::information(0, i18n("Bookmark importing is complete."));
+
+ // Add the imported stuff to the current bookmarks
+ KFTPBookmarks::Manager::self()->importSites(m_plugin->getImportedXml().documentElement());
+
+ accept();
+ }
+}
+
+void ImportWizard::displayPluginList()
+{
+ KTrader::OfferList plugins = KFTPAPI::getInstance()->pluginManager()->getImportPlugins();
+
+ KTrader::OfferList::ConstIterator end(plugins.end());
+ for (KTrader::OfferList::ConstIterator i(plugins.begin()); i != end; ++i) {
+ KService::Ptr service = *i;
+
+ new PluginListItem(m_pluginList, service);
+ }
+}
+
+void ImportWizard::slotPluginsSelectionChanged(QListViewItem *i)
+{
+ if (i) {
+ PluginListItem *item = static_cast<PluginListItem*>(i);
+ m_service = item->m_service;
+
+ setNextEnabled(Step1, true);
+ } else {
+ setNextEnabled(Step1, false);
+ }
+}
+
+}
+
+}
+
+#include "importwizard.moc"
diff --git a/kftpgrabber/src/widgets/bookmarks/importwizard.h b/kftpgrabber/src/widgets/bookmarks/importwizard.h
new file mode 100644
index 0000000..9b74dd3
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/importwizard.h
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKIMPORTWIZARD_H
+#define KFTPBOOKMARKIMPORTWIZARD_H
+
+#include "kftpbookmarkimportlayout.h"
+
+#include <kparts/componentfactory.h>
+#include <klistview.h>
+
+class KFTPBookmarkImportPlugin;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+class PluginListItem : public KListViewItem
+{
+friend class ImportWizard;
+public:
+ PluginListItem(KListView *parent, KService::Ptr service);
+private:
+ KService::Ptr m_service;
+};
+
+/**
+ * This is a wizard used to import bookmarks via detected KParts plugins.
+ *
+ * @author Jernej Kos
+ */
+class ImportWizard : public KFTPBookmarkImportLayout
+{
+Q_OBJECT
+public:
+ ImportWizard(QWidget *parent = 0, const char *name = 0);
+private:
+ KService::Ptr m_service;
+ KFTPBookmarkImportPlugin *m_plugin;
+
+ void displayPluginList();
+private slots:
+ virtual void next();
+
+ void slotImportProgress(int progress);
+ void slotPluginsSelectionChanged(QListViewItem *i);
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/bookmarks/listview.cpp b/kftpgrabber/src/widgets/bookmarks/listview.cpp
new file mode 100644
index 0000000..4349604
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/listview.cpp
@@ -0,0 +1,532 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpapi.h"
+#include "listview.h"
+#include "kftpbookmarks.h"
+#include "kftpsession.h"
+#include "misc.h"
+
+#include <qdragobject.h>
+
+#include <kaction.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kio/passdlg.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+ListViewItem::ListViewItem(QListView *parent, const QString &t1)
+ : KListViewItem(parent, t1)
+{
+}
+
+ListViewItem::ListViewItem(QListViewItem *parent, const QString &t1)
+ : KListViewItem(parent, t1)
+{
+}
+
+int ListViewItem::compare(QListViewItem *i, int col, bool) const
+{
+ if (m_type != static_cast<ListViewItem*>(i)->m_type) {
+ if (m_type == 0)
+ return -1; // category
+ else
+ return 1; // server
+ }
+
+ return KListViewItem::compare(i, col, false);
+}
+
+ListView::ListView(KFTPBookmarks::Manager *bookmarks, QWidget *parent, const char *name)
+ : KFTPWidgets::ListView(parent, name),
+ m_autoUpdate(false),
+ m_connectBookmark(false),
+ m_editMenuItem(false),
+ m_bookmarks(bookmarks),
+ m_activeSite(0),
+ m_activeCategory(0),
+ m_activeItem(0)
+{
+ // Set some stuff
+ setMinimumWidth(150);
+ setFullWidth(true);
+ addColumn(i18n("Bookmarks"));
+ setRootIsDecorated(true);
+ setEmptyListText(i18n("No bookmarks."));
+ setItemsRenameable(false);
+
+ // Drag & drop
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setDropVisualizer(false);
+
+ // Init auto open timer
+ m_openTimer = new QTimer(this);
+
+ connect(this, SIGNAL(dropped(QDropEvent*, QListViewItem*)), this, SLOT(slotDropped(QDropEvent*, QListViewItem*)));
+ connect(this, SIGNAL(clicked(QListViewItem*)), this, SLOT(slotClicked(QListViewItem*)));
+ connect(this, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(slotDoubleClicked(QListViewItem*)));
+ connect(this, SIGNAL(contextMenuRequested(QListViewItem*, const QPoint&, int)), this, SLOT(slotContextMenu(QListViewItem*, const QPoint&, int)));
+
+ /* Init the actions */
+ m_newAction = new KAction(i18n("&New..."), "filenew", KShortcut(), this, SLOT(slotNewAction()), actionCollection(), "bookmark_new");
+ m_renameAction = new KAction(i18n("&Rename"), KShortcut(), this, SLOT(slotRenameAction()), actionCollection(), "bookmark_rename");
+ m_deleteAction = new KAction(i18n("&Delete"), "editdelete", KShortcut(), this, SLOT(slotDeleteAction()), actionCollection(), "bookmark_delete");
+ m_subCatAction = new KAction(i18n("&Create Subcategory..."), "folder_new", KShortcut(), this, SLOT(slotSubCatAction()), actionCollection(), "bookmark_subcat");
+ m_copyAction = new KAction(i18n("&Duplicate"), KShortcut(), this, SLOT(slotDuplicateAction()), actionCollection(), "bookmark_duplicate");
+}
+
+KActionCollection *ListView::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+void ListView::setAutoUpdate(bool value)
+{
+ m_autoUpdate = value;
+
+ if (value)
+ connect(m_bookmarks, SIGNAL(update()), this, SLOT(slotAutoUpdate()));
+
+ slotAutoUpdate();
+}
+
+void ListView::setConnectBookmark(bool value)
+{
+ m_connectBookmark = value;
+
+ if (value)
+ connect(this, SIGNAL(executed(QListViewItem*)), this, SLOT(slotBookmarkExecuted(QListViewItem*)));
+}
+
+void ListView::setEditMenuItem(bool value)
+{
+ m_editMenuItem = value;
+}
+
+void ListView::slotBookmarkExecuted(QListViewItem *item)
+{
+ if (!item || !m_connectBookmark || static_cast<ListViewItem*>(item)->m_type == BT_CATEGORY)
+ return;
+
+ KFTPBookmarks::Site *site = static_cast<ListViewItem*>(item)->m_site;
+ KURL siteUrl = site->getUrl();
+
+ // Handle empty usernames and passwords for non-anonymous sites
+ if (!siteUrl.hasUser() || !siteUrl.hasPass() && siteUrl.user() != "anonymous") {
+ KIO::PasswordDialog *dlg = new KIO::PasswordDialog(i18n("Please provide your username and password for connecting to this site."), siteUrl.user(), true);
+ dlg->addCommentLine(i18n("Site:"), QString("%1:%2").arg(siteUrl.host()).arg(siteUrl.port()));
+
+ if (dlg->exec() == KDialogBase::Accepted) {
+ siteUrl.setUser(dlg->username());
+ siteUrl.setPass(dlg->password());
+
+ if (dlg->keepPassword()) {
+ // Save password to the bookmarked site
+ site->setProperty("username", dlg->username());
+ site->setProperty("password", encodePassword(dlg->password()));
+ }
+
+ delete dlg;
+ } else {
+ // Abort connection attempt
+ delete dlg;
+ return;
+ }
+ }
+
+ // Just spawn a new session
+ KFTPSession::Session *session = KFTPSession::Manager::self()->spawnRemoteSession(KFTPSession::IgnoreSide, siteUrl, site);
+ m_bookmarks->setupClient(site, session->getClient());
+}
+
+void ListView::slotAutoUpdate()
+{
+ if (m_autoUpdate) {
+ // Update the bookmark list
+ fillBookmarkData();
+ }
+}
+
+QDragObject *ListView::dragObject()
+{
+ // Determine hotspot and pixmap
+ QPoint hotspot;
+ QPixmap pixmap = *selectedItem()->pixmap(0);
+ hotspot.setX(pixmap.width() / 2);
+ hotspot.setY(pixmap.height() / 2);
+
+ QString id = static_cast<ListViewItem*>(selectedItem())->m_site->id();
+ m_dragObject = new QStoredDrag("application/x-qlistviewitem", this);
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << id;
+
+ // Start the drag
+ static_cast<QStoredDrag*>(m_dragObject)->setEncodedData(data);
+ m_dragObject->setPixmap(pixmap, hotspot);
+
+ return m_dragObject;
+}
+
+bool ListView::acceptDrag(QDropEvent *e) const
+{
+ // If it is a local drag, accept it
+ return e->source() == static_cast<QWidget*>(const_cast<ListView*>(this));
+}
+
+void ListView::contentsDragEnterEvent(QDragEnterEvent *e)
+{
+ if (!acceptDrag(e)) {
+ e->ignore();
+ return;
+ }
+ e->acceptAction();
+
+ m_currentBeforeDropItem = selectedItem();
+ QListViewItem *item = itemAt(contentsToViewport(e->pos()));
+
+ if (item) {
+ m_dropItem = item;
+ m_openTimer->start(750);
+ } else {
+ m_dropItem = 0L;
+ }
+}
+
+void ListView::contentsDragMoveEvent(QDragMoveEvent *e)
+{
+ if (!acceptDrag(e)) {
+ e->ignore();
+ return;
+ }
+ e->acceptAction();
+
+ QListViewItem *item = itemAt(contentsToViewport(e->pos()));
+ if (item) {
+ setSelected(item, true);
+ if (item != m_dropItem) {
+ m_openTimer->stop();
+ m_dropItem = item;
+ m_openTimer->start(750);
+ }
+ } else {
+ if (selectedItem()) {
+ setSelected(selectedItem(), false);
+ }
+
+ m_openTimer->stop();
+ m_dropItem = 0L;
+ }
+}
+
+void ListView::contentsDragLeaveEvent(QDragLeaveEvent*)
+{
+ if (m_currentBeforeDropItem) {
+ setSelected(m_currentBeforeDropItem, true);
+ ensureItemVisible(m_currentBeforeDropItem);
+ } else {
+ setSelected(m_dropItem, false);
+ }
+
+ m_openTimer->stop();
+ m_dropItem = 0L;
+}
+
+void ListView::slotOpenTimer()
+{
+ m_openTimer->stop();
+ if (m_dropItem && m_dropItem->isExpandable()) {
+ // Expand the category
+ m_dropItem->setOpen(true);
+ }
+}
+
+void ListView::slotDropped(QDropEvent *e, QListViewItem*)
+{
+ KFTPBookmarks::Site *parentSite = 0L;
+
+ if (selectedItem()) {
+ QListViewItem *newParent = 0L;
+
+ // Get the new path
+ if (static_cast<ListViewItem*>(selectedItem())->m_type == 0)
+ newParent = selectedItem();
+ else
+ newParent = selectedItem()->parent();
+
+ if (newParent)
+ parentSite = static_cast<ListViewItem*>(newParent)->m_site;
+ else
+ parentSite = m_bookmarks->findCategory("root");
+ } else {
+ parentSite = m_bookmarks->findCategory("root");
+ }
+
+ QString id;
+
+ // Decode the data
+ QDataStream arg(e->encodedData("application/x-qlistviewitem"), IO_ReadOnly);
+ arg >> id;
+
+ // Move the site
+ KFTPBookmarks::Site *originalSite = m_bookmarks->findSite(id);
+ parentSite->reparentSite(originalSite);
+
+ emit bookmarkMoved();
+
+ // Notify the bookmark manager
+ m_bookmarks->emitUpdate();
+}
+
+void ListView::fillBookmarkData()
+{
+ // Fill the tree with data
+ m_bookmarks->guiPopulateBookmarksTree(this);
+}
+
+void ListView::slotClicked(QListViewItem *item)
+{
+ m_activeItem = static_cast<ListViewItem*>(item);
+
+ if (m_activeItem) {
+ if (m_activeItem->m_type == BT_CATEGORY) {
+ // Category
+ m_activeCategory = m_activeItem->m_site;
+ m_activeSite = 0L;
+ } else {
+ // Server
+ m_activeSite = m_activeItem->m_site;
+ m_activeCategory = m_activeSite->getParentSite();
+ }
+ }
+
+ emit bookmarkClicked(item);
+}
+
+void ListView::slotDoubleClicked(QListViewItem *item)
+{
+ if (!item)
+ return;
+
+ setOpen(item, !item->isOpen());
+}
+
+KFTPBookmarks::Manager *ListView::getBookmarks()
+{
+ return m_bookmarks;
+}
+
+void ListView::slotRenameAction()
+{
+ // Rename a subcategory
+ ListViewItem *item = static_cast<ListViewItem*>(selectedItems().at(0));
+ KFTPBookmarks::Site *site = item->m_site;
+
+ bool ok;
+ QString newName = KInputDialog::getText(i18n("Category Name"), i18n("Rename category:"), item->text(0), &ok, this);
+
+ if (ok) {
+ // Ok, let's rename it
+ site->setAttribute("name", newName);
+ item->setText(0, newName);
+ }
+}
+
+void ListView::slotSubCatAction()
+{
+ // Create a subcategory
+ ListViewItem *item = static_cast<ListViewItem*>(selectedItems().at(0));
+ KFTPBookmarks::Site *site = item ? item->m_site : m_bookmarks->findCategory("root");
+
+ bool ok;
+ QString newName = KInputDialog::getText(i18n("New Category Name"), i18n("New category:"), "", &ok, this);
+
+ if (ok) {
+ // Let's create the sub category
+ site->addCategory(newName);
+
+ emit categoryRenamed();
+ m_bookmarks->emitUpdate();
+ }
+}
+
+void ListView::slotNewAction()
+{
+ if (!m_activeCategory) {
+ // Set the starting category to document root
+ m_activeCategory = m_bookmarks->findCategory("root");
+ }
+
+ // Create the new node
+ KFTPBookmarks::Site *site = m_activeCategory->addSite();
+ site->setAttribute("name", i18n("New server"));
+ site->setProperty("port", 21);
+
+ // Create the ListViewItem
+ ListViewItem *serv = 0L;
+ if (!m_activeItem || (!m_activeItem->parent() && m_activeItem->m_type == BT_SERVER)) {
+ serv = new ListViewItem(this, i18n("New Server"));
+ } else if (m_activeItem->m_type == BT_CATEGORY) {
+ serv = new ListViewItem(m_activeItem, i18n("New Server"));
+ m_activeItem->setOpen(true);
+ } else {
+ serv = new ListViewItem(m_activeItem->parent(), i18n("New Server"));
+ }
+
+ serv->m_type = BT_SERVER;
+ serv->m_site = site;
+
+ serv->setPixmap(0, loadSmallPixmap("ftp"));
+
+ // Set the new ListViewItem as active
+ setSelected(serv, true);
+ m_activeItem = serv;
+
+ // Display its properties
+ m_activeSite = site;
+
+ emit bookmarkNew(serv, site);
+}
+
+void ListView::slotDuplicateAction()
+{
+ // Copy a bookmark
+ ListViewItem *item = static_cast<ListViewItem*>(selectedItems().at(0));
+
+ // Clone the node
+ KFTPBookmarks::Site *copy = item->m_site->duplicate();
+
+ // Create the ListViewItem
+ ListViewItem *serv = 0L;
+ if (item->parent())
+ serv = new ListViewItem(item->parent(), copy->getAttribute("name"));
+ else
+ serv = new ListViewItem(this, copy->getAttribute("name"));
+
+ serv->m_type = BT_SERVER;
+ serv->m_site = copy;
+
+ serv->setPixmap(0, loadSmallPixmap("ftp"));
+
+ // Set the new ListViewItem as active
+ setSelected(serv, true);
+ m_activeItem = serv;
+
+ // Display its properties
+ m_activeSite = copy;
+
+ emit bookmarkDuplicated(serv, copy);
+
+ // Update the bookmarks
+ m_bookmarks->emitUpdate();
+}
+
+void ListView::slotDeleteAction()
+{
+ // Delete a server or a category
+ ListViewItem *item = static_cast<ListViewItem*>(selectedItems().at(0));
+
+ // What do we have here ?
+ if (item->m_type == BT_CATEGORY) {
+ // Category
+ if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove this category?")) == KMessageBox::Yes) {
+ m_bookmarks->delSite(item->m_site);
+ } else {
+ return;
+ }
+ } else {
+ // Server
+ if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove this server?")) == KMessageBox::Yes) {
+ m_bookmarks->delSite(item->m_site);
+ } else {
+ return;
+ }
+ }
+
+ if ( !m_autoUpdate )
+ delete item;
+
+ m_activeItem = 0L;
+ emit bookmarkDeleted();
+}
+
+void ListView::slotContextMenu(QListViewItem *item, const QPoint &pos, int)
+{
+ slotClicked(item);
+
+ KPopupMenu *context = new KPopupMenu(this);
+
+ if (item) {
+ context->insertTitle(item->text(0));
+
+ // Server or category
+ if (static_cast<ListViewItem*>(item)->m_type == BT_CATEGORY) {
+ m_newAction->plug(context);
+ m_deleteAction->plug(context);
+ m_subCatAction->plug(context);
+ m_renameAction->plug(context);
+ } else {
+ if (m_editMenuItem)
+ actionCollection()->action("bookmark_edit2")->plug(context);
+
+ m_newAction->plug(context);
+ m_copyAction->plug(context);
+ m_deleteAction->plug(context);
+ }
+ } else {
+ // Nothing selected
+ m_newAction->plug(context);
+ m_subCatAction->plug(context);
+ }
+
+ context->exec(pos);
+
+ delete context;
+}
+
+}
+
+}
+
+#include "listview.moc"
diff --git a/kftpgrabber/src/widgets/bookmarks/listview.h b/kftpgrabber/src/widgets/bookmarks/listview.h
new file mode 100644
index 0000000..213ec03
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/listview.h
@@ -0,0 +1,193 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKEDITORLISTVIEW_H
+#define KFTPBOOKMARKEDITORLISTVIEW_H
+
+#include <qdom.h>
+#include <qtimer.h>
+
+#include "../listview.h"
+
+class KAction;
+class KActionCollection;
+class Sidebar;
+class KFTPSelectServerDialog;
+
+namespace KFTPBookmarks {
+ class Site;
+ class Manager;
+ class BookmarkEditor;
+ class Sidebar;
+}
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+class ListView;
+
+class ListViewItem : public KListViewItem
+{
+friend class BookmarkEditor;
+friend class KFTPWidgets::Bookmarks::ListView;
+friend class Sidebar;
+friend class ::KFTPSelectServerDialog;
+public:
+ ListViewItem(QListView *parent, const QString &t1);
+ ListViewItem(QListViewItem *parent, const QString &t1);
+
+ int compare(QListViewItem *i, int col, bool) const;
+
+ void setSite(KFTPBookmarks::Site *site) { m_site = site; }
+ void setType(int type) { m_type = type; }
+private:
+ int m_type;
+ KFTPBookmarks::Site *m_site;
+};
+
+/**
+@author Jernej Kos
+*/
+class ListView : public KFTPWidgets::ListView
+{
+Q_OBJECT
+public:
+ ListView(KFTPBookmarks::Manager *bookmarks, QWidget *parent = 0, const char *name = 0);
+
+ /**
+ * Fill current treeview with all the bookmarks.
+ */
+ void fillBookmarkData();
+
+ /**
+ * This changes the auto-update behaviour of the ListView. If set to true, this
+ * list view will automaticly update when bookmarks are changed. Defaults
+ * to false.
+ *
+ * @param value True to enable auto update, false otherwise
+ */
+ void setAutoUpdate(bool value);
+
+ /**
+ * This changes the connect-on-click behaviour of the ListView. If set to true,
+ * a new remote session will be spawned whenever the users double clicks the
+ * bookmark.
+ *
+ * @param value True to enable connect on click, false otherwise
+ */
+ void setConnectBookmark(bool value);
+
+ /**
+ * Get the bookmarks, the listview operates on
+ */
+ KFTPBookmarks::Manager *getBookmarks();
+
+ /**
+ * Specifiy, whether an edit menuitem should be placed in the contextmenu
+ *
+ * @param value True to enable the edit menuitem, false otherwise
+ */
+ void setEditMenuItem(bool value);
+
+private:
+ enum BookmarkType {
+ BT_CATEGORY = 0,
+ BT_SERVER
+ };
+
+ bool m_autoUpdate;
+ bool m_connectBookmark;
+ bool m_editMenuItem;
+ QDragObject *m_dragObject;
+
+ /* Actions */
+ KAction *m_newAction;
+ KAction *m_renameAction;
+ KAction *m_deleteAction;
+ KAction *m_subCatAction;
+ KAction *m_copyAction;
+
+ /* Auto open categories support */
+ QListViewItem *m_dropItem;
+ QListViewItem* m_currentBeforeDropItem;
+ QTimer *m_openTimer;
+
+ /* Specifies, on which bookmarks we operate */
+ KFTPBookmarks::Manager *m_bookmarks;
+
+ KFTPBookmarks::Site *m_activeSite;
+ KFTPBookmarks::Site *m_activeCategory;
+ KFTPWidgets::Bookmarks::ListViewItem *m_activeItem;
+
+ KActionCollection *actionCollection();
+
+ /* Drag & drop support */
+ QDragObject *dragObject();
+ bool acceptDrag(QDropEvent *e) const;
+ void contentsDragEnterEvent(QDragEnterEvent *e);
+ void contentsDragMoveEvent(QDragMoveEvent *e);
+ void contentsDragLeaveEvent(QDragLeaveEvent*);
+private slots:
+ void slotDropped(QDropEvent *e, QListViewItem*);
+ void slotDoubleClicked(QListViewItem *item);
+ void slotOpenTimer();
+
+ void slotClicked(QListViewItem*);
+ void slotNewAction();
+ void slotRenameAction();
+ void slotDeleteAction();
+ void slotSubCatAction();
+ void slotDuplicateAction();
+ void slotContextMenu(QListViewItem*, const QPoint&, int col);
+
+ void slotAutoUpdate();
+ void slotBookmarkExecuted(QListViewItem*);
+signals:
+ void bookmarkMoved();
+ void bookmarkNew(ListViewItem*, KFTPBookmarks::Site*);
+ void bookmarkDeleted();
+ void bookmarkDuplicated(ListViewItem*, KFTPBookmarks::Site*);
+ void bookmarkClicked(QListViewItem*);
+
+ void categoryRenamed();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/bookmarks/sidebar.cpp b/kftpgrabber/src/widgets/bookmarks/sidebar.cpp
new file mode 100644
index 0000000..21ee0d9
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/sidebar.cpp
@@ -0,0 +1,158 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <qlayout.h>
+#include <qsplitter.h>
+#include <qvbox.h>
+
+#include <kaction.h>
+#include <klocale.h>
+#include <ktoolbar.h>
+
+#include "kftpapi.h"
+#include "kftpbookmarks.h"
+#include "editor.h"
+#include "listview.h"
+#include "misc.h"
+
+#include "sidebar.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+KActionCollection *Sidebar::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+Sidebar::Sidebar(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ m_toolBar = new KToolBar(this, "bookmarkToolBar");
+ m_toolBar->setIconSize(16);
+ layout->addWidget(m_toolBar);
+
+ // Create the list view for editing bookmarks
+ m_tree = new ListView(KFTPBookmarks::Manager::self(), this);
+ m_tree->setAutoUpdate(true);
+ m_tree->setConnectBookmark(true);
+ m_tree->setEditMenuItem(true);
+
+ layout->addWidget(m_tree);
+
+ m_editAction = new KAction(i18n("&Edit..."), "edit", KShortcut(), this, SLOT(slotEditAction()), actionCollection(), "bookmark_edit2");
+ connect(m_tree, SIGNAL(bookmarkClicked(QListViewItem*)), this, SLOT(slotClicked(QListViewItem*)));
+ connect(m_tree, SIGNAL(bookmarkNew(ListViewItem*, KFTPBookmarks::Site*)), this, SLOT(slotNewAction(ListViewItem*, KFTPBookmarks::Site*)));
+
+ // Get the new bookmark data
+ m_tree->fillBookmarkData();
+
+ // Init the Actions
+ slotClicked(0L);
+
+ setMinimumWidth(200);
+}
+
+Sidebar::~Sidebar()
+{
+}
+
+void Sidebar::refresh()
+{
+ m_tree->clear();
+ m_tree->fillBookmarkData();
+}
+
+void Sidebar::slotEditAction()
+{
+ ListViewItem* item = static_cast<ListViewItem*>(m_tree->selectedItems().at(0));
+
+ if (item) {
+ BookmarkEditor *editor = new BookmarkEditor(item, this);
+
+ editor->exec();
+ delete editor;
+
+ // Update the bookmarks globaly
+ KFTPBookmarks::Manager::self()->emitUpdate();
+ }
+}
+
+void Sidebar::slotNewAction(ListViewItem*, KFTPBookmarks::Site *site)
+{
+ BookmarkEditor *editor = new BookmarkEditor(static_cast<ListViewItem*>(m_tree->selectedItems().at(0)), this);
+
+ if (!editor->exec()) {
+ // If the user clicks Abort, remove the newly created server
+ KFTPBookmarks::Manager::self()->delSite(site);
+ }
+
+ delete editor;
+}
+
+void Sidebar::slotClicked(QListViewItem *item)
+{
+ // When nodes are expanded, item is 0, although an item is still selected, so grab it here
+ item = m_tree->selectedItems().at(0);
+
+ // Enable/Disable actions for the toolbar
+ if (!item) {
+ actionCollection()->action("bookmark_delete")->setEnabled(false);
+ actionCollection()->action("bookmark_subcat")->setEnabled(true);
+ m_editAction->setEnabled(false);
+ return;
+ }
+
+ actionCollection()->action("bookmark_delete")->setEnabled(true);
+
+ if (static_cast<ListViewItem*>(item)->m_type == BT_CATEGORY) {
+ m_editAction->setEnabled(false);
+ actionCollection()->action("bookmark_subcat")->setEnabled(true);
+ } else {
+ m_editAction->setEnabled(true);
+ actionCollection()->action("bookmark_subcat")->setEnabled(false);
+ }
+}
+
+}
+
+}
+
+#include "sidebar.moc"
diff --git a/kftpgrabber/src/widgets/bookmarks/sidebar.h b/kftpgrabber/src/widgets/bookmarks/sidebar.h
new file mode 100644
index 0000000..ef08d3e
--- /dev/null
+++ b/kftpgrabber/src/widgets/bookmarks/sidebar.h
@@ -0,0 +1,88 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPBOOKMARKSIDEBAR_H
+#define KFTPBOOKMARKSIDEBAR_H
+
+namespace KFTPBookmarks {
+ class Site;
+}
+
+class KAction;
+class KToolBar;
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+
+class ListViewItem;
+class ListView;
+
+/**
+@author Markus Brueffer
+*/
+class Sidebar : public QWidget
+{
+Q_OBJECT
+public:
+ Sidebar(QWidget *parent = 0, const char *name = 0);
+ ~Sidebar();
+
+private:
+ enum BookmarkType {
+ BT_CATEGORY = 0,
+ BT_SERVER
+ };
+
+ KToolBar *m_toolBar;
+ ListView *m_tree;
+
+ KAction *m_editAction;
+ KActionCollection *actionCollection();
+public slots:
+ void refresh();
+private slots:
+ void slotClicked(QListViewItem*);
+
+ /* Action slots */
+ void slotEditAction();
+ void slotNewAction(ListViewItem *item, KFTPBookmarks::Site *site);
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/Makefile.am b/kftpgrabber/src/widgets/browser/Makefile.am
new file mode 100644
index 0000000..2b9c987
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/Makefile.am
@@ -0,0 +1,13 @@
+INCLUDES = -I$(srcdir)/../.. -I../.. \
+ -I$(srcdir)/../../engine \
+ -I$(srcdir)/../../misc \
+ -I$(srcdir)/.. \
+ -I$(srcdir)/../../ui -I../../ui \
+ $(all_includes)
+
+METASOURCES = AUTO
+noinst_LIBRARIES = libbrowser.a
+noinst_HEADERS = view.h actions.h treeview.h propsplugin.h \
+ filterwidget.h detailsview.h locationnavigator.h dirlister.h
+libbrowser_a_SOURCES = view.cpp actions.cpp treeview.cpp \
+ propsplugin.cpp filterwidget.cpp detailsview.cpp locationnavigator.cpp dirlister.cpp
diff --git a/kftpgrabber/src/widgets/browser/actions.cpp b/kftpgrabber/src/widgets/browser/actions.cpp
new file mode 100644
index 0000000..cc9fc8c
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/actions.cpp
@@ -0,0 +1,764 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "browser/actions.h"
+#include "browser/view.h"
+#include "browser/detailsview.h"
+#include "browser/propsplugin.h"
+#include "browser/filterwidget.h"
+
+#include "widgets/quickconnect.h"
+#include "widgets/popupmessage.h"
+
+#include "kftpbookmarks.h"
+#include "kftpqueue.h"
+#include "kftpapi.h"
+#include "kftpsession.h"
+#include "verifier.h"
+#include "mainactions.h"
+
+#include "misc.h"
+#include "misc/config.h"
+#include "misc/filter.h"
+#include "misc/customcommands/manager.h"
+
+#include <kglobal.h>
+#include <kcharsets.h>
+#include <kapplication.h>
+#include <kmainwindow.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kinputdialog.h>
+#include <kpropertiesdialog.h>
+#include <kio/job.h>
+#include <kshred.h>
+#include <klineedit.h>
+#include <kfiledialog.h>
+#include <kstandarddirs.h>
+
+#include <qdir.h>
+#include <qclipboard.h>
+
+using namespace KFTPGrabberBase;
+using namespace KFTPEngine;
+using namespace KFTPCore;
+using namespace KFTPCore::Filter;
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+Actions::Actions(View *parent)
+ : QObject(parent),
+ m_view(parent)
+{
+}
+
+void Actions::initActions()
+{
+ m_actionCollection = new KActionCollection(m_view, this);
+
+ // Create all the actions
+ m_goUpAction = KStdAction::up(this, SLOT(slotGoUp()), m_actionCollection, "go_up");
+ m_goBackAction = KStdAction::back(this, SLOT(slotGoBack()), m_actionCollection, "go_back");
+ m_goForwardAction = KStdAction::forward(this, SLOT(slotGoForward()), m_actionCollection, "go_forward");
+ m_goHomeAction = KStdAction::home(this, SLOT(slotGoHome()), m_actionCollection, "go_home");
+
+ m_reloadAction = KStdAction::redisplay(this, SLOT(slotReload()), m_actionCollection, "reload");
+ m_reloadAction->setText(i18n("&Reload"));
+ m_reloadAction->setShortcut(KShortcut(Qt::Key_F5));
+
+ m_abortAction = new KAction(i18n("&Abort"), "stop", KShortcut(), this, SLOT(slotAbort()), m_actionCollection, "abort");
+ m_toggleTreeViewAction = new KToggleAction(i18n("&Show Tree View"), "view_tree", KShortcut(), this, SLOT(slotShowHideTree()), m_actionCollection, "toggle_tree_view");
+ m_toggleFilterAction = new KToggleAction(i18n("Show &Filter"), "filter", KShortcut(), this, SLOT(slotShowHideFilter()), m_actionCollection, "toggle_filter");
+
+ m_renameAction = new KAction(i18n("&Rename"), KShortcut(Qt::Key_F2), this, SLOT(slotRename()), m_actionCollection, "edit_rename");
+ m_deleteAction = new KAction(i18n("&Delete"), "editdelete", KShortcut(Qt::Key_Delete), this, SLOT(slotDelete()), m_actionCollection, "edit_delete");
+ m_propsAction = new KAction(i18n("&Properties"), KShortcut(), this, SLOT(slotProps()), m_actionCollection, "edit_properties");
+ m_shredAction = new KAction(i18n("&Shred"), "editshred", KShortcut(), this, SLOT(slotShred()), m_actionCollection, "edit_shred");
+
+ m_copyAction = KStdAction::copy(this, SLOT(slotCopy()), m_actionCollection, "edit_copy");
+ m_pasteAction = KStdAction::paste(this, SLOT(slotPaste()), m_actionCollection, "edit_paste");
+
+ m_filterActions = new KActionMenu(i18n("&Filter Options"), "", m_actionCollection, "edit_filter_options");
+ m_alwaysSkipAction = new KAction(i18n("Always &skip this file when queuing"), KShortcut(), this, SLOT(slotAlwaysSkip()), m_actionCollection);
+ m_topPriorityAction = new KAction(i18n("Make this file &top priority"), KShortcut(), this, SLOT(slotTopPriority()), m_actionCollection);
+ m_lowPriorityAction = new KAction(i18n("Make this file &lowest priority"), KShortcut(), this, SLOT(slotLowPriority()), m_actionCollection);
+
+ m_filterActions->insert(m_alwaysSkipAction);
+ m_filterActions->insert(m_topPriorityAction);
+ m_filterActions->insert(m_lowPriorityAction);
+
+ m_transferAction = new KAction(i18n("&Transfer"), KShortcut(), this, SLOT(slotTransfer()), m_actionCollection, "transfer");
+ m_queueTransferAction = new KAction(i18n("&Queue Transfer"), "queue", KShortcut(), this, SLOT(slotQueueTransfer()), m_actionCollection, "queue_transfer");
+ m_createDirAction = new KAction(i18n("&Create Directory..."), "folder_new", KShortcut(), this, SLOT(slotCreateDir()), m_actionCollection, "create_dir");
+ m_fileEditAction = new KAction(i18n("&Open file"), "fileopen", KShortcut(), this, SLOT(slotFileEdit()), m_actionCollection, "open_file");
+ m_verifyAction = new KAction(i18n("&Verify..."), "ok", KShortcut(), this, SLOT(slotVerify()), m_actionCollection, "verify");
+
+ populateEncodings();
+
+ m_moreActions = new KActionMenu(i18n("&More Actions"), "configure", this);
+ m_rawCmdAction = new KAction(i18n("&Manual Command Entry..."), "openterm", KShortcut(), this, SLOT(slotRawCmd()), m_actionCollection, "send_raw_cmd");
+ m_exportListingAction = new KAction(i18n("&Export Directory Listing..."), "", KShortcut(), this, SLOT(slotExportListing()), m_actionCollection, "export_listing");
+ m_showHiddenFilesAction = new KToggleAction(i18n("Show &Hidden Files && Directories"), KShortcut(), this, SLOT(slotShowHiddenFiles()), m_actionCollection, "show_hidden");
+ m_openExternalAction = new KAction(i18n("Open current directory in &Konqueror..."), "konqueror", KShortcut(), this, SLOT(slotOpenExternal()), m_actionCollection, "open_konqi");
+
+ m_markItemsAction = new KAction(i18n("Compare &selected items"), "", KShortcut(Qt::Key_Space), this, SLOT(slotMarkItems()), m_actionCollection, "compare_selected");
+ m_compareAction = new KAction(i18n("Compare &directories"), "", KShortcut(), this, SLOT(slotCompare()), m_actionCollection, "compare_dirs");
+
+ m_showHiddenFilesAction->setChecked(KFTPCore::Config::showHiddenFiles());
+
+ m_rawCommandsMenu = CustomCommands::Manager::self()->categories(i18n("Send &Raw Command"), m_view->getSession());
+ m_rawCommandsMenu->insert(m_rawCmdAction, 0);
+ m_rawCommandsMenu->popupMenu()->insertSeparator(1);
+
+ m_moreActions->insert(m_rawCommandsMenu);
+ m_moreActions->insert(m_changeEncodingAction);
+ m_moreActions->popupMenu()->insertSeparator();
+ m_moreActions->insert(m_exportListingAction);
+ m_moreActions->insert(m_openExternalAction);
+ m_moreActions->insert(m_markItemsAction);
+ m_moreActions->insert(m_compareAction);
+ m_moreActions->popupMenu()->insertSeparator();
+ m_moreActions->insert(m_showHiddenFilesAction);
+
+ m_moreActions->setStickyMenu(true);
+ m_moreActions->setDelayed(false);
+
+ m_siteChangeAction = new KActionMenu(i18n("&Change Site"), "goto", this);
+ m_quickConnectAction = new KAction(i18n("&Quick Connect..."), "connect_creating", KShortcut(), this, SLOT(slotQuickConnect()), m_actionCollection, "quick_connect");
+ m_connectAction = new KActionMenu(i18n("&Connect To"), this);
+ m_disconnectAction = new KAction(i18n("&Disconnect"), "connect_no", KShortcut(), this, SLOT(slotDisconnect()), m_actionCollection, "disconnect");
+
+ m_siteChangeAction->insert(m_quickConnectAction);
+ m_siteChangeAction->insert(m_connectAction);
+ m_siteChangeAction->insert(m_disconnectAction);
+ m_siteChangeAction->setStickyMenu(true);
+ m_siteChangeAction->setDelayed(false);
+
+ // Populate bookmarks
+ KFTPBookmarks::Manager::self()->guiPopulateBookmarksMenu(m_connectAction, QDomNode(), false, m_view->m_session);
+}
+
+void Actions::populateEncodings()
+{
+ // Charsets
+ m_changeEncodingAction = new KActionMenu(i18n("Change Remote &Encoding"), "charset", m_actionCollection, "changeremoteencoding");
+ m_changeEncodingAction->setDelayed(false);
+
+ KPopupMenu *menu = m_changeEncodingAction->popupMenu();
+ menu->clear();
+
+ QStringList charsets = KGlobal::charsets()->descriptiveEncodingNames();
+ int count = 0;
+ for (QStringList::iterator i = charsets.begin(); i != charsets.end(); ++i)
+ menu->insertItem(*i, this, SLOT(slotCharsetChanged(int)), 0, ++count);
+
+ menu->insertSeparator();
+ menu->insertItem(i18n("Default"), this, SLOT(slotCharsetReset(int)), 0, ++count);
+ menu->setItemChecked(count, true);
+
+ m_defaultCharsetOption = count;
+ m_curCharsetOption = count;
+}
+
+void Actions::updateActions()
+{
+ m_goUpAction->setEnabled(m_view->url().upURL() != m_view->url());
+
+ // History
+ int index = 0;
+ const QValueList<LocationNavigator::Element> list = m_view->history(index);
+
+ m_goBackAction->setEnabled(index < static_cast<int>(list.count()) - 1);
+ m_goForwardAction->setEnabled(index > 0);
+
+ m_abortAction->setEnabled(m_view->m_ftpClient->socket()->isBusy());
+ m_toggleTreeViewAction->setEnabled(true);
+ m_toggleFilterAction->setEnabled(true);
+
+ m_quickConnectAction->setEnabled(m_view->url().isLocalFile());
+ m_connectAction->setEnabled(true);
+ m_disconnectAction->setEnabled(m_view->m_ftpClient->socket()->isConnected());
+
+ const KFileItemList *selectedItems = m_view->selectedItems();
+
+ if (selectedItems->count() == 1) {
+ m_fileEditAction->setEnabled(!selectedItems->getFirst()->isDir());
+ m_verifyAction->setEnabled(selectedItems->getFirst()->isLocalFile() && selectedItems->getFirst()->name(true).right(3) == "sfv");
+ } else {
+ m_fileEditAction->setEnabled(false);
+ m_verifyAction->setEnabled(false);
+ }
+
+ // Check if we can transfer anything
+ KFTPSession::Session *session = m_view->m_session;
+ KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
+
+ m_renameAction->setEnabled(session->isConnected());
+ m_deleteAction->setEnabled(session->isConnected());
+ m_propsAction->setEnabled(true);
+ m_shredAction->setEnabled(!session->isRemote());
+ m_copyAction->setEnabled(true);
+ m_pasteAction->setEnabled(true);
+
+ if ((!session->isRemote() && !opposite->isRemote()) ||
+ (
+ (session->isRemote() && opposite->isRemote()) &&
+ (
+ session->getClient()->socket()->protocolName() != opposite->getClient()->socket()->protocolName() ||
+ !(session->getClient()->socket()->features() & SF_FXP_TRANSFER)
+ )
+ )
+ ) {
+ m_queueTransferAction->setEnabled(false);
+ m_transferAction->setEnabled(false);
+ } else {
+ m_queueTransferAction->setEnabled(true);
+ m_transferAction->setEnabled(true);
+ }
+
+ if (!session->isRemote() || session->getClient()->socket()->isConnected())
+ m_createDirAction->setEnabled(true);
+ else
+ m_createDirAction->setEnabled(false);
+
+ m_changeEncodingAction->setEnabled(session->isRemote());
+ m_rawCmdAction->setEnabled(!m_view->url().isLocalFile() && m_view->m_ftpClient->socket()->features() & SF_RAW_COMMAND);
+ m_rawCommandsMenu->setEnabled(m_rawCmdAction->isEnabled());
+ m_openExternalAction->setEnabled(!session->isRemote());
+}
+
+void Actions::slotGoUp()
+{
+ m_view->goUp();
+}
+
+void Actions::slotGoBack()
+{
+ m_view->goBack();
+}
+
+void Actions::slotGoForward()
+{
+ m_view->goForward();
+}
+
+void Actions::slotReload()
+{
+ m_view->reload();
+}
+
+void Actions::slotGoHome()
+{
+ m_view->goHome();
+}
+
+void Actions::slotQuickConnect()
+{
+ // Create/get the new dialog
+ QuickConnectDialog *quickConnect = new QuickConnectDialog(m_view);
+
+ if (quickConnect->exec() == KDialogBase::Accepted) {
+ // Get the url and connect
+ if (m_view->m_ftpClient->socket()->isConnected()) {
+ if (KFTPCore::Config::confirmDisconnects() && KMessageBox::warningYesNo(0, i18n("Do you want to drop current connection?")) == KMessageBox::No)
+ return;
+
+ m_view->m_session->disconnectAllConnections();
+ }
+
+ m_view->m_session->setSite(0);
+
+ quickConnect->setupClient(m_view->m_ftpClient);
+ m_view->m_ftpClient->connect(quickConnect->getUrl());
+ }
+
+ delete quickConnect;
+}
+
+void Actions::slotDisconnect()
+{
+ if (m_view->m_ftpClient->socket()->isConnected()) {
+ if (KFTPCore::Config::confirmDisconnects() && KMessageBox::warningYesNo(0, i18n("Do you want to drop current connection?")) == KMessageBox::No)
+ return;
+
+ m_view->m_session->disconnectAllConnections();
+ }
+}
+
+void Actions::slotShred()
+{
+ // Shred the file
+ if (KMessageBox::warningContinueCancel(0, i18n("Are you sure you want to SHRED this file?"), i18n("Shred File"),KGuiItem(i18n("&Shred"), "editshred")) == KMessageBox::Cancel)
+ return;
+
+ KShred::shred(m_view->selectedItems()->getFirst()->url().path());
+}
+
+void Actions::slotRename()
+{
+ KFTPWidgets::Browser::DetailsView *view = m_view->getDetailsView();
+
+ // Rename the first file in the current selection
+ view->rename(view->KListView::selectedItems().at(0), 0);
+
+ // Enhanced rename: Don't highlight the file extension. (from Konqueror)
+ KLineEdit *le = view->renameLineEdit();
+
+ if (le) {
+ const QString txt = le->text();
+ QString pattern;
+ KMimeType::diagnoseFileName(txt, pattern);
+
+ if (!pattern.isEmpty() && pattern.at(0) == '*' && pattern.find('*',1) == -1)
+ le->setSelection(0, txt.length()-pattern.stripWhiteSpace().length()+1);
+ else {
+ int lastDot = txt.findRev('.');
+
+ if (lastDot > 0)
+ le->setSelection(0, lastDot);
+ }
+ }
+}
+
+void Actions::slotDelete()
+{
+ KFTPSession::Session *session = m_view->getSession();
+
+ // Delete a file or directory
+ KURL::List selection = m_view->selectedURLs();
+ KURL::List::ConstIterator i = selection.begin();
+ QStringList prettyList;
+ for (; i != selection.end(); ++i) {
+ prettyList.append((*i).pathOrURL());
+ }
+
+ if (KMessageBox::warningContinueCancelList(0,
+ i18n("Do you really want to delete this item?", "Do you really want to delete these %n items?", prettyList.count()),
+ prettyList,
+ i18n("Delete Files"),
+ KStdGuiItem::del(),
+ QString::null,
+ KMessageBox::Dangerous) == KMessageBox::Cancel)
+ return;
+
+ // Go trough all files and delete them
+ if (!session->isRemote()) {
+ KIO::del(selection);
+ } else {
+ KURL::List::Iterator end(selection.end());
+
+ for (KURL::List::Iterator i(selection.begin()); i != end; ++i) {
+ if (!(*i).isLocalFile())
+ session->getClient()->remove(KURL((*i).url()));
+ }
+ }
+}
+
+void Actions::slotCopy()
+{
+ QClipboard *cb = QApplication::clipboard();
+ cb->setData(m_view->getDetailsView()->dragObject(), QClipboard::Clipboard);
+}
+
+void Actions::slotPaste()
+{
+ // Decode the data and try to init transfer
+ KIO::MetaData p_meta;
+ KURL::List p_urls;
+
+ if (KURLDrag::decode(QApplication::clipboard()->data(), p_urls, p_meta)) {
+ // Add destination url and call the QueueManager
+ p_meta.insert("DestURL", m_view->url().url());
+ KURLDrag *drag = new KURLDrag(p_urls, p_meta, m_view, name());
+ KFTPQueue::Manager::self()->insertTransfer(drag);
+ }
+}
+
+void Actions::slotProps()
+{
+ // Show file properties
+ const KFileItemList *selectedItems = m_view->selectedItems();
+ KFileItem *item = selectedItems->getFirst();
+
+ if (selectedItems->count() == 0) {
+ if (m_view->url().isLocalFile())
+ item = new KFileItem(m_view->url(), 0, 0);
+ else
+ return;
+ }
+
+ // Show the dialog
+ KPropertiesDialog *propsDialog;
+
+ if (item->isLocalFile()) {
+ if (selectedItems->count() == 0)
+ propsDialog = new KPropertiesDialog(item);
+ else
+ propsDialog = new KPropertiesDialog(*selectedItems);
+ } else {
+ propsDialog = new KPropertiesDialog(item->name());
+ propsDialog->insertPlugin(new KFTPWidgets::Browser::PropsPlugin(propsDialog, *selectedItems));
+ propsDialog->insertPlugin(new KFTPWidgets::Browser::PermissionsPropsPlugin(propsDialog, *selectedItems, m_view->getSession()));
+ }
+
+ propsDialog->exec();
+}
+
+void Actions::addPriorityItems(int priority)
+{
+ // Add the files to skiplist
+ KURL::List selection = m_view->selectedURLs();
+ KURL::List::Iterator end(selection.end());
+
+ for (KURL::List::Iterator i(selection.begin()); i != end; ++i) {
+ Rule *rule = new Rule();
+
+ if (priority == 0) {
+ rule->setName(i18n("Skip '%1'").arg((*i).filename()));
+ const_cast<ConditionChain*>(rule->conditions())->append(new Condition(Filename, Condition::Is, (*i).filename()));
+ const_cast<ActionChain*>(rule->actions())->append(new Action(Action::Skip, QVariant()));
+ } else {
+ rule->setName(i18n("Priority '%1'").arg((*i).filename()));
+ const_cast<ConditionChain*>(rule->conditions())->append(new Condition(Filename, Condition::Is, (*i).filename()));
+ const_cast<ActionChain*>(rule->actions())->append(new Action(Action::Priority, priority));
+ }
+
+ Filters::self()->append(rule);
+ }
+}
+
+void Actions::slotAlwaysSkip()
+{
+ addPriorityItems(0);
+}
+
+void Actions::slotTopPriority()
+{
+ addPriorityItems(1);
+}
+
+void Actions::slotLowPriority()
+{
+ addPriorityItems(-1);
+}
+
+void Actions::slotTransfer()
+{
+ // Queue a transfer
+ KFileItemList list(*m_view->selectedItems());
+ KFileItemListIterator i(list);
+ KFileItem *item;
+ KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
+ KFTPQueue::Transfer *transfer = 0L;
+
+ while ((item = i.current()) != 0) {
+ KURL destinationUrl = opposite->getFileView()->url();
+ destinationUrl.addPath(item->name());
+
+ transfer = KFTPQueue::Manager::self()->spawnTransfer(
+ item->url(),
+ destinationUrl,
+ item->size(),
+ item->isDir(),
+ list.count() == 1,
+ true,
+ 0L,
+ true
+ );
+
+ ++i;
+ }
+
+ // Execute transfer
+ if (transfer)
+ static_cast<KFTPQueue::Site*>(transfer->parentObject())->delayedExecute();
+}
+
+void Actions::slotQueueTransfer()
+{
+ // Queue a transfer
+ KFileItemList list(*m_view->selectedItems());
+ KFileItemListIterator i(list);
+ KFileItem *item;
+ KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
+
+ while ((item = i.current()) != 0) {
+ KURL destinationUrl = opposite->getFileView()->url();
+ destinationUrl.addPath(item->name());
+
+ KFTPQueue::Manager::self()->spawnTransfer(
+ item->url(),
+ destinationUrl,
+ item->size(),
+ item->isDir(),
+ list.count() == 1,
+ true,
+ 0L,
+ list.count() > 1
+ );
+
+ ++i;
+ }
+}
+
+void Actions::slotCreateDir()
+{
+ // Create new directory
+ bool ok;
+ QString newDirName = KInputDialog::getText(i18n("Create Directory"), i18n("Directory name:"), "", &ok);
+
+ if (ok) {
+ KURL url = m_view->url();
+ url.addPath(newDirName);
+
+ if (url.isLocalFile())
+ KIO::mkdir(url);
+ else
+ m_view->m_ftpClient->mkdir(url);
+ }
+}
+
+void Actions::slotFileEdit()
+{
+ KFileItem *item = m_view->selectedItems()->getFirst();
+
+ if (!item->isDir()) {
+ if (item->isLocalFile()) {
+ item->run();
+ } else {
+ // Create a new transfer to download the file and open it
+ KFTPQueue::TransferFile *transfer = new KFTPQueue::TransferFile(KFTPQueue::Manager::self());
+ transfer->setSourceUrl(item->url());
+ transfer->setDestUrl(KURL(KGlobal::dirs()->saveLocation("tmp") + QString("%1-%2").arg(KApplication::randomString(7)).arg(item->name())));
+ transfer->addSize(item->size());
+ transfer->setTransferType(KFTPQueue::Download);
+ transfer->setOpenAfterTransfer(true);
+ KFTPQueue::Manager::self()->insertTransfer(transfer);
+
+ // Execute the transfer
+ transfer->delayedExecute();
+ }
+ }
+}
+
+void Actions::slotAbort()
+{
+ KFTPSession::Session *session = KFTPSession::Manager::self()->find(m_view);
+
+ // Abort the session
+ if (session)
+ session->abort();
+}
+
+void Actions::slotRawCmd()
+{
+ bool ok;
+ QString rawCmd = KInputDialog::getText(i18n("Send Raw Command"), i18n("Command:"), "", &ok);
+
+ if (ok)
+ m_view->m_ftpClient->raw(rawCmd);
+}
+
+void Actions::slotShowHideTree()
+{
+ m_view->setTreeVisible(m_toggleTreeViewAction->isChecked());
+}
+
+void Actions::slotShowHideFilter()
+{
+ if (m_toggleFilterAction->isChecked()) {
+ m_view->m_searchToolBar->show();
+ m_view->m_searchFilter->clear();
+ m_view->m_searchFilter->setFocus();
+ } else {
+ m_view->m_searchFilter->clear();
+ m_view->m_searchToolBar->hide();
+ }
+}
+
+void Actions::slotCharsetChanged(int id)
+{
+ if (!m_changeEncodingAction->popupMenu()->isItemChecked(id)) {
+ QStringList charsets = KGlobal::charsets()->descriptiveEncodingNames();
+ QString charset = KGlobal::charsets()->encodingForName(charsets[id - 1]);
+
+ // Set the current socket's charset
+ m_view->m_ftpClient->socket()->changeEncoding(charset);
+
+ // Update checked items
+ m_changeEncodingAction->popupMenu()->setItemChecked(id, true);
+ m_changeEncodingAction->popupMenu()->setItemChecked(m_curCharsetOption, false);
+ m_curCharsetOption = id;
+ }
+}
+
+void Actions::slotCharsetReset(int id)
+{
+ // Revert to default charset if possible
+ KFTPBookmarks::Site *site = m_view->m_session->getSite();
+
+ if (site) {
+ // Set the current socket's charset
+ m_view->m_ftpClient->socket()->changeEncoding(site->getProperty("encoding"));
+
+ // Update checked items
+ m_changeEncodingAction->popupMenu()->setItemChecked(id, true);
+ m_changeEncodingAction->popupMenu()->setItemChecked(m_curCharsetOption, false);
+ m_curCharsetOption = id;
+ }
+}
+
+void Actions::slotExportListing()
+{
+ QString savePath = KFileDialog::getSaveFileName(QString::null, "*.txt|Directory Dump", 0, i18n("Export Directory Listing"));
+
+ if (!savePath.isEmpty()) {
+ QFile file(savePath);
+
+ if (!file.open(IO_WriteOnly))
+ return;
+
+ QTextStream stream(&file);
+
+ KFileItemList list(*m_view->items());
+ KFileItemListIterator i(list);
+ KFileItem *item;
+
+ while ((item = i.current()) != 0) {
+ stream << item->permissionsString() << "\t";
+ stream << item->user() << "\t" << item->group() << "\t";
+ stream << item->timeString() << "\t";
+ stream << item->name() << "\t";
+ stream << "\n";
+
+ ++i;
+ }
+
+ file.flush();
+ file.close();
+ }
+}
+
+void Actions::slotVerify()
+{
+ KFTPWidgets::Verifier *verifier = new KFTPWidgets::Verifier();
+ verifier->setFile(m_view->selectedItems()->getFirst()->url().path());
+ verifier->exec();
+
+ delete verifier;
+}
+
+void Actions::slotShowHiddenFiles()
+{
+ m_view->setShowHidden(m_showHiddenFilesAction->isChecked());
+ m_view->reload();
+}
+
+void Actions::slotOpenExternal()
+{
+ KFileItem *folder = new KFileItem(m_view->url(), "inode/directory", S_IFDIR);
+ folder->run();
+}
+
+void Actions::slotMarkItems()
+{
+ KFileItemList list(*m_view->selectedItems());
+ KFileItemListIterator i(list);
+ KFileItem *item;
+ KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
+
+ DetailsView *tView = m_view->getDetailsView();
+ DetailsView *oView = opposite->getFileView()->getDetailsView();
+
+ while ((item = i.current()) != 0) {
+ tView->markItem(item);
+ oView->markItem(item->name());
+ ++i;
+ }
+}
+
+void Actions::slotCompare()
+{
+ KFTPSession::Session *opposite = KFTPSession::Manager::self()->getActive(oppositeSide(m_view->m_session->getSide()));
+
+ DetailsView *tView = m_view->getDetailsView();
+ DetailsView *oView = opposite->getFileView()->getDetailsView();
+
+ // All items in the other list view should be visible by default
+ QListViewItemIterator j(oView);
+ while (j.current()) {
+ KFileItem *oItem = static_cast<KFileListViewItem*>(*j)->fileInfo();
+ oView->setItemVisibility(oItem, true);
+
+ ++j;
+ }
+
+ // Compare the two listviews
+ QListViewItemIterator i(tView);
+ while (i.current()) {
+ KFileItem *tItem = static_cast<KFileListViewItem*>(*i)->fileInfo();
+
+ if (tItem) {
+ KFileItem *oItem = oView->fileItem(tItem->name());
+
+ if (oItem && (oItem->size() == tItem->size() || oItem->isDir())) {
+ tView->setItemVisibility(tItem, false);
+ oView->setItemVisibility(oItem, false);
+ } else {
+ tView->setItemVisibility(tItem, true);
+ }
+ }
+
+ ++i;
+ }
+
+ PopupMessage *popup = new PopupMessage(m_view->getStatusLabel(), m_view);
+ popup->setText(i18n("Identical files on both sides have been hidden. Only <b>different files</b> are now visible."));
+ popup->setImage(SmallIcon("info"));
+ popup->setShowCloseButton(false);
+ popup->setShowCounter(false);
+
+ popup->reposition();
+ popup->display();
+}
+
+}
+
+}
+
+#include "actions.moc"
diff --git a/kftpgrabber/src/widgets/browser/actions.h b/kftpgrabber/src/widgets/browser/actions.h
new file mode 100644
index 0000000..69434e4
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/actions.h
@@ -0,0 +1,189 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPFILEDIRVIEWACTIONS_H
+#define KFTPFILEDIRVIEWACTIONS_H
+
+#include <qobject.h>
+#include <kaction.h>
+#include <krun.h>
+#include <kservice.h>
+#include <kuserprofile.h>
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class View;
+
+/**
+ * This class contains all per-view actions.
+ *
+ * @author Jernej Kos
+ */
+class Actions : public QObject
+{
+Q_OBJECT
+friend class View;
+friend class DetailsView;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent view widget
+ */
+ Actions(View *parent);
+
+ /**
+ * Initialize view's action collection and it's actions.
+ */
+ void initActions();
+
+ /**
+ * Properly enable/disable the available actions.
+ */
+ void updateActions();
+private:
+ KActionCollection *m_actionCollection;
+ View *m_view;
+
+ int m_curCharsetOption;
+ int m_defaultCharsetOption;
+
+ KAction *m_goUpAction;
+ KAction *m_goBackAction;
+ KAction *m_goForwardAction;
+ KAction *m_goHomeAction;
+ KAction *m_reloadAction;
+
+ KAction *m_abortAction;
+ KToggleAction *m_toggleTreeViewAction;
+ KToggleAction *m_toggleFilterAction;
+
+ KAction *m_renameAction;
+ KAction *m_deleteAction;
+ KAction *m_propsAction;
+ KAction *m_shredAction;
+
+ KAction *m_copyAction;
+ KAction *m_pasteAction;
+
+ KActionMenu *m_filterActions;
+ KAction *m_alwaysSkipAction;
+ KAction *m_topPriorityAction;
+ KAction *m_lowPriorityAction;
+
+ KAction *m_transferAction;
+ KAction *m_queueTransferAction;
+ KAction *m_createDirAction;
+ KAction *m_fileEditAction;
+ KAction *m_verifyAction;
+
+ KActionMenu *m_moreActions;
+ KActionMenu *m_rawCommandsMenu;
+ KAction *m_rawCmdAction;
+ KActionMenu *m_changeEncodingAction;
+ KAction *m_exportListingAction;
+ KToggleAction *m_showHiddenFilesAction;
+ KAction *m_openExternalAction;
+
+ KAction *m_markItemsAction;
+ KAction *m_compareAction;
+
+ KActionMenu *m_siteChangeAction;
+ KAction *m_quickConnectAction;
+ KActionMenu *m_connectAction;
+ KAction *m_disconnectAction;
+private:
+ /**
+ * Populates the encodings list.
+ */
+ void populateEncodings();
+
+ /**
+ * A helper function to add the currently selected item(s) to the
+ * priority list with the given priority.
+ *
+ * @param priority The priority to use
+ */
+ void addPriorityItems(int priority);
+private slots:
+ void slotGoUp();
+ void slotGoBack();
+ void slotGoForward();
+ void slotGoHome();
+ void slotReload();
+
+ void slotAbort();
+ void slotShowHideTree();
+ void slotShowHideFilter();
+
+ void slotRename();
+ void slotDelete();
+ void slotProps();
+ void slotShred();
+
+ void slotCopy();
+ void slotPaste();
+
+ void slotAlwaysSkip();
+ void slotTopPriority();
+ void slotLowPriority();
+
+ void slotTransfer();
+ void slotQueueTransfer();
+ void slotCreateDir();
+ void slotFileEdit();
+ void slotVerify();
+
+ void slotRawCmd();
+ void slotCharsetChanged(int);
+ void slotCharsetReset(int);
+ void slotExportListing();
+ void slotShowHiddenFiles();
+ void slotOpenExternal();
+
+ void slotMarkItems();
+ void slotCompare();
+
+ void slotQuickConnect();
+ void slotDisconnect();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/detailsview.cpp b/kftpgrabber/src/widgets/browser/detailsview.cpp
new file mode 100644
index 0000000..5206d3d
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/detailsview.cpp
@@ -0,0 +1,596 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "browser/detailsview.h"
+#include "browser/treeview.h"
+#include "browser/view.h"
+#include "browser/locationnavigator.h"
+#include "browser/dirlister.h"
+#include "browser/actions.h"
+
+#include "misc/config.h"
+#include "misc/kftpapi.h"
+#include "misc/filter.h"
+
+#include "kftpqueue.h"
+
+#include <qheader.h>
+#include <qpainter.h>
+
+#include <kpopupmenu.h>
+#include <kurldrag.h>
+
+using namespace KFTPCore::Filter;
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+DetailsView::DetailsView(QWidget *parent, View *view, KFTPSession::Session *session)
+ : KFileDetailView(parent, 0),
+ m_view(view),
+ m_treeView(0),
+ m_refreshing(false),
+ m_shouldDisableResize(true),
+ m_autoResizeEnabled(true)
+{
+ m_resizeTimer = new QTimer(this);
+ connect(m_resizeTimer, SIGNAL(timeout()), this, SLOT(updateColumnWidths()));
+
+ m_dirLister = new DirLister(this);
+ m_dirLister->setSession(session);
+
+ connect(m_dirLister, SIGNAL(clear()), this, SLOT(slotClear()));
+ connect(m_dirLister, SIGNAL(completed()), this, SLOT(slotCompleted()));
+ connect(m_dirLister, SIGNAL(deleteItem(KFileItem*)), this, SLOT(slotDeleteItem(KFileItem*)));
+ connect(m_dirLister, SIGNAL(refreshItems()), this, SLOT(slotRefreshItems()));
+ connect(m_dirLister, SIGNAL(siteChanged(const KURL&)), this, SLOT(slotSiteChanged(const KURL&)));
+
+ m_navigator = new LocationNavigator(this);
+
+ connect(m_navigator, SIGNAL(urlChanged(const KURL&)), this, SLOT(slotUrlChanged(const KURL&)));
+
+ connect(this, SIGNAL(executed(QListViewItem*)), this, SLOT(slotItemExecuted()));
+ connect(this, SIGNAL(returnPressed(QListViewItem*)), this, SLOT(slotItemExecuted()));
+ connect(this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), this, SLOT(slotContextMenu(KListView*, QListViewItem*, const QPoint&)));
+ connect(this, SIGNAL(itemRenamed(QListViewItem*, const QString&, int)), this, SLOT(slotItemRenamed(QListViewItem*, const QString&)));
+
+ // Setup the header
+ QHeader *viewHeader = header();
+ viewHeader->setResizeEnabled(true);
+ viewHeader->setMovingEnabled(false);
+
+ connect(viewHeader, SIGNAL(sizeChange(int, int, int)), this, SLOT(slotHeaderResized(int)));
+
+ // Set column width
+ setColumnWidthMode(NameColumn, QListView::Manual);
+ setColumnWidthMode(SizeColumn, QListView::Manual);
+ setColumnWidthMode(DateColumn, QListView::Manual);
+ setColumnWidthMode(PermissionsColumn, QListView::Manual);
+
+ // Set column alignments
+ setColumnAlignment(SizeColumn, Qt::AlignRight);
+ setColumnAlignment(DateColumn, Qt::AlignHCenter);
+ setColumnAlignment(PermissionsColumn, Qt::AlignHCenter);
+
+ if (KFTPCore::Config::showOwnerGroup()) {
+ setColumnAlignment(OwnerColumn, Qt::AlignHCenter);
+ setColumnAlignment(GroupColumn, Qt::AlignHCenter);
+ } else {
+ // Only show owner/group if set in the config
+ removeColumn(4);
+ removeColumn(4);
+ }
+
+ setColumnWidth(NameColumn, 140);
+ setColumnWidth(DateColumn, 100);
+
+ setAcceptDrops(true);
+ setSelectionMode(KFile::Extended);
+ setHScrollBarMode(QScrollView::AlwaysOff);
+
+ // Set the defaults
+ setHomeUrl(KURL(KFTPCore::Config::defLocalDir()));
+ setShowHidden(KFTPCore::Config::showHiddenFiles());
+}
+
+DetailsView::~DetailsView()
+{
+}
+
+const KURL &DetailsView::url() const
+{
+ return m_navigator->url();
+}
+
+const QValueList<LocationNavigator::Element> DetailsView::history(int &index) const
+{
+ return m_navigator->history(index);
+}
+
+bool DetailsView::isSelected(const KFileItem *i) const
+{
+ if (!i)
+ return false;
+
+ const KFileListViewItem *item = static_cast<const KFileListViewItem*>(i->extraData(this));
+ return (item && item->isSelected() && item->isVisible());
+}
+
+void DetailsView::setTreeView(TreeView *tree)
+{
+ m_treeView = tree;
+
+ connect(m_treeView, SIGNAL(pathChanged(const KURL&)), this, SLOT(openUrl(const KURL&)));
+}
+
+void DetailsView::setHomeUrl(const KURL &url)
+{
+ m_navigator->setHomeUrl(url);
+}
+
+void DetailsView::goBack()
+{
+ m_navigator->goBack();
+}
+
+void DetailsView::goForward()
+{
+ m_navigator->goForward();
+}
+
+void DetailsView::goUp()
+{
+ m_navigator->goUp();
+}
+
+void DetailsView::goHome()
+{
+ m_navigator->goHome();
+}
+
+void DetailsView::endItemUpdates()
+{
+ const KFileListViewItem *item = static_cast<const KFileListViewItem*>(firstChild());
+ if (item)
+ setCurrentItem(item->fileInfo());
+
+ int index = 0;
+ const QValueList<LocationNavigator::Element> history = m_navigator->history(index);
+ if (!history.isEmpty()) {
+ KFileView::setCurrentItem(history[index].currentFilename());
+ KFileDetailView::setSelected(currentFileItem(), true);
+
+ // Scroll the contents to last known coordinates
+ setContentsPos(history[index].contentsX(), history[index].contentsY());
+ }
+
+ m_treeView->openUrl(m_navigator->url());
+ m_treeView->endUpdate(m_navigator->url());
+ setFocus();
+}
+
+void DetailsView::openUrl(const KURL &url)
+{
+ m_navigator->setUrl(url);
+}
+
+void DetailsView::slotClear()
+{
+ clearView();
+}
+
+void DetailsView::slotDeleteItem(KFileItem *item)
+{
+ removeItem(item);
+
+ if (item->isDir())
+ m_treeView->removeFolder(item->url());
+}
+
+void DetailsView::slotCompleted()
+{
+ m_refreshing = true;
+
+ clearView();
+
+ KFileItemList items(m_dirLister->items());
+ KFileItemListIterator i(items);
+
+ KFileItem *item = 0;
+ while ((item = i.current()) != 0) {
+ insertItem(item);
+
+ if (item->isDir())
+ m_treeView->createFolder(item->url(), item->pixmap(16));
+
+ ++i;
+ }
+
+ endItemUpdates();
+ m_refreshing = false;
+
+ m_view->updateActions();
+}
+
+void DetailsView::slotRefreshItems()
+{
+ QTimer::singleShot(0, this, SLOT(reload()));
+}
+
+void DetailsView::reload()
+{
+ fetchLocation(m_navigator->url(), true);
+}
+
+void DetailsView::slotUrlChanged(const KURL &url)
+{
+ fetchLocation(url);
+}
+
+void DetailsView::slotSiteChanged(const KURL &url)
+{
+ m_navigator->clear();
+ m_treeView->resetView(url);
+}
+
+void DetailsView::fetchLocation(const KURL &url, bool reload)
+{
+ m_dirLister->setShowingDotFiles(m_showHidden);
+ m_dirLister->fetchLocation(url, reload);
+}
+
+void DetailsView::slotContentsMoving(int x, int y)
+{
+ if (!m_refreshing)
+ emit contentsMoved(x, y);
+}
+
+void DetailsView::slotItemExecuted()
+{
+ KFileItem *item = currentFileItem();
+
+ if (item) {
+ if (item->isDir())
+ openUrl(item->url());
+ }
+}
+
+void DetailsView::slotHeaderResized(int section)
+{
+ if (m_autoResizeEnabled && m_shouldDisableResize && section == 0) {
+ setHScrollBarMode(QScrollView::Auto);
+ m_autoResizeEnabled = false;
+ }
+}
+
+void DetailsView::resizeContents(int width, int height)
+{
+ m_shouldDisableResize = false;
+
+ KFileDetailView::resizeContents(width, height);
+
+ // Update the column widths
+ if (m_autoResizeEnabled) {
+ m_resizeTimer->stop();
+ m_resizeTimer->start(50, true);
+ }
+}
+
+void DetailsView::resizeEvent(QResizeEvent *event)
+{
+ m_shouldDisableResize = false;
+
+ KFileDetailView::resizeEvent(event);
+
+ // Update the column widths
+ if (m_autoResizeEnabled) {
+ m_resizeTimer->stop();
+ m_resizeTimer->start(50, true);
+ }
+}
+
+void DetailsView::updateColumnWidths()
+{
+ // The code below is based on Dolphin, Copyright (C) 2006 by Peter Penz
+ const int columnCount = columns();
+ int requiredWidth = 0;
+
+ for (int i = 1; i < columnCount; ++i) {
+ // When a directory contains no items, a minimum width for
+ // the column must be available, so that the header is readable.
+ int columnWidth = 64;
+ QFontMetrics fontMetrics(font());
+
+ for (QListViewItem* item = firstChild(); item != 0; item = item->nextSibling()) {
+ const int width = item->width(fontMetrics, this, i);
+
+ if (width > columnWidth) {
+ columnWidth = width;
+ }
+ }
+
+ // Add custom margin
+ columnWidth += 16;
+ setColumnWidth(i, columnWidth);
+ requiredWidth += columnWidth;
+ }
+
+ // Resize the first column in a way that the whole available width is used
+ int firstColumnWidth = visibleWidth() - requiredWidth;
+ if (firstColumnWidth < 128) {
+ firstColumnWidth = 128;
+ }
+
+ setColumnWidth(0, firstColumnWidth);
+ m_shouldDisableResize = true;
+}
+
+void DetailsView::insertItem(KFileItem *fileItem)
+{
+ const ActionChain *actionChain = Filters::self()->process(fileItem->url(), fileItem->size(), fileItem->isDir());
+ const Action *action;
+
+ if ((actionChain && actionChain->getAction(Action::Hide)))
+ return;
+
+ KFileView::insertItem(fileItem);
+
+ ListViewItem *item = new ListViewItem(this, fileItem);
+
+ if (actionChain && (action = actionChain->getAction(Action::Colorize)))
+ item->setColor(action->value().toColor());
+
+ QDir::SortSpec spec = KFileView::sorting();
+ if (spec & QDir::Time) {
+ item->setKey(sortingKey(fileItem->time(KIO::UDS_MODIFICATION_TIME), fileItem->isDir(), spec));
+ } else if (spec & QDir::Size) {
+ item->setKey(sortingKey(fileItem->size(), fileItem->isDir(), spec));
+ } else {
+ item->setKey(sortingKey(fileItem->text(), fileItem->isDir(), spec));
+ }
+
+ fileItem->setExtraData(this, item);
+}
+
+void DetailsView::slotContextMenu(KListView*, QListViewItem *i, const QPoint &p)
+{
+ m_view->updateActions();
+
+ // Create the popup menu
+ KPopupMenu *menu = new KPopupMenu(this);
+
+ Actions *actions = m_view->m_actions;
+
+ // Always show create directory
+ actions->m_createDirAction->plug(menu);
+ menu->insertSeparator();
+
+ // If nothing is selected, show the navigation menus
+ if (!i) {
+ actions->m_goUpAction->plug(menu);
+ actions->m_goBackAction->plug(menu);
+ actions->m_goForwardAction->plug(menu);
+ actions->m_reloadAction->plug(menu);
+ } else {
+ actions->m_transferAction->plug(menu);
+ actions->m_queueTransferAction->plug(menu);
+ actions->m_renameAction->plug(menu);
+ actions->m_deleteAction->plug(menu);
+ actions->m_shredAction->plug(menu);
+ actions->m_fileEditAction->plug(menu);
+ actions->m_verifyAction->plug(menu);
+ menu->insertSeparator();
+ actions->m_copyAction->plug(menu);
+ actions->m_pasteAction->plug(menu);
+ menu->insertSeparator();
+ actions->m_filterActions->plug(menu);
+ }
+
+ // Always show properties
+ menu->insertSeparator();
+ actions->m_propsAction->plug(menu);
+
+ menu->exec(p);
+}
+
+void DetailsView::slotItemRenamed(QListViewItem *item, const QString &name)
+{
+ KFileItem *fileItem = static_cast<KFileListViewItem*>(item)->fileInfo();
+ m_view->rename(fileItem->url(), name);
+}
+
+QDragObject *DetailsView::dragObject()
+{
+ KURLDrag *object = static_cast<KURLDrag*>(KFileDetailView::dragObject());
+
+ // Add some metadata
+ const KFileItemList *list = KFileView::selectedItems();
+
+ if (list) {
+ KFileItemListIterator i(*list);
+ KFileItem *item;
+
+ while ((item = i.current()) != 0) {
+ QString type = item->isDir() ? "D" : "F";
+ object->metaData().insert(item->url().htmlURL().local8Bit(), type + ":" + KIO::number(item->size()));
+ ++i;
+ }
+ }
+
+ return object;
+}
+
+bool DetailsView::acceptDrag(QDropEvent *event) const
+{
+ return KURLDrag::canDecode(event) &&
+ (event->action() == QDropEvent::Copy ||
+ event->action() == QDropEvent::Move ||
+ event->action() == QDropEvent::Link) &&
+ event->source() != this;
+}
+
+void DetailsView::contentsDropEvent(QDropEvent *event)
+{
+ if (!acceptDrag(event))
+ return;
+
+ KIO::MetaData meta;
+ KURL::List urls;
+ KURLDrag::decode(event, urls, meta);
+
+ meta.insert("DestURL", url().url());
+ KFTPQueue::Manager::self()->insertTransfer(new KURLDrag(urls, meta, this, name()));
+}
+
+KFileItem *DetailsView::fileItem(const QString &filename)
+{
+ if (!filename.isNull()) {
+ KFileItem *item;
+
+ for (item = firstFileItem(); item; item = nextItem(item)) {
+ if (item->name() == filename)
+ return item;
+ }
+ }
+
+ return 0;
+}
+
+void DetailsView::setItemVisibility(KFileItem *item, int visibility)
+{
+ ListViewItem *i = static_cast<ListViewItem*>(item->extraData(this));
+
+ if (i) {
+ if (visibility != 0 && visibility != 1)
+ visibility = !i->isVisible();
+
+ i->setVisible(visibility);
+ }
+}
+
+void DetailsView::setItemColor(KFileItem *item, const QColor &text, const QColor &background)
+{
+ ListViewItem *i = static_cast<ListViewItem*>(item->extraData(this));
+
+ if (i) {
+ i->setColor(text);
+ i->setBackground(background);
+ i->repaint();
+ }
+}
+
+void DetailsView::markItem(KFileItem *item)
+{
+ ListViewItem *i = static_cast<ListViewItem*>(item->extraData(this));
+
+ if (i) {
+ i->markItem(!i->marked());
+ }
+}
+
+void DetailsView::markItem(const QString &filename)
+{
+ if (KFileItem *item = fileItem(filename))
+ markItem(item);
+}
+
+void DetailsView::unmarkItems()
+{
+ KFileItem *item;
+
+ for (item = firstFileItem(); item; item = nextItem(item)) {
+ static_cast<ListViewItem*>(item->extraData(this))->markItem(false);
+ }
+}
+
+DetailsView::ListViewItem::ListViewItem(QListView *parent, KFileItem *fileItem)
+ : KFileListViewItem(parent, fileItem),
+ m_marked(false)
+{
+ if (fileItem->isDir() && !KFTPCore::Config::showDirectorySize()) {
+ setText(SizeColumn, " - ");
+ } else {
+ QString sizeText;
+ sizeText = KFTPCore::Config::showSizeInBytes() ? KIO::number(fileItem->size()) : KIO::convertSize(fileItem->size());
+ sizeText.append(" ");
+
+ setText(SizeColumn, sizeText);
+ }
+}
+
+void DetailsView::ListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
+{
+ QColorGroup colorGroup(cg);
+ QColor textColor = colorGroup.text();
+
+ // Set custom file item color if set
+ if (m_textColor.isValid())
+ colorGroup.setColor(QColorGroup::Text, m_textColor);
+
+ // Set custom file item font
+ QFont font = p->font();
+ font.setBold(m_marked);
+ p->setFont(font);
+
+ if (m_backgroundColor.isValid()) {
+ colorGroup.setColor(QColorGroup::Base, m_backgroundColor);
+
+ // Override the KListViewItem since it resets the background color
+ QListViewItem::paintCell(p, colorGroup, column, width, alignment);
+ } else {
+ KFileListViewItem::paintCell(p, colorGroup, column, width, alignment);
+ }
+
+ if (column < listView()->columns() - 1) {
+ // Draw a separator between columns
+ p->setPen(KGlobalSettings::buttonBackground());
+ p->drawLine(width - 1, 0, width - 1, height() - 1);
+ }
+}
+
+void DetailsView::ListViewItem::markItem(bool marked)
+{
+ if (m_marked != marked) {
+ m_marked = marked;
+ repaint();
+ }
+}
+
+}
+
+}
+
+#include "detailsview.moc"
diff --git a/kftpgrabber/src/widgets/browser/detailsview.h b/kftpgrabber/src/widgets/browser/detailsview.h
new file mode 100644
index 0000000..eb60b70
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/detailsview.h
@@ -0,0 +1,374 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETS_BROWSERDETAILSVIEW_H
+#define KFTPWIDGETS_BROWSERDETAILSVIEW_H
+
+#include "browser/locationnavigator.h"
+
+#include <kfiledetailview.h>
+#include <kdirlister.h>
+
+namespace KFTPSession {
+ class Session;
+}
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class DirLister;
+class TreeView;
+class View;
+
+/**
+ * This class represents a detailed list view for displaying local and
+ * remote directory contents. It is based upon KFileDetailView but uses
+ * a custom (wrapped) DirLister for actual listings.
+ *
+ * @author Jernej Kos
+ */
+class DetailsView : public KFileDetailView {
+Q_OBJECT
+public:
+ /**
+ * Maps the column indices of KFileDetailView to a
+ * descriptive column name.
+ */
+ enum ColumnName {
+ NameColumn = 0,
+ SizeColumn = 1,
+ DateColumn = 2,
+ PermissionsColumn = 3,
+ OwnerColumn = 4,
+ GroupColumn = 5
+ };
+
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ * @param view Main view container
+ * @param session Current session
+ */
+ DetailsView(QWidget *parent, View *view, KFTPSession::Session *session);
+
+ /**
+ * Class destructor.
+ */
+ ~DetailsView();
+
+ /**
+ * Returns the navigator object for navigating this view.
+ */
+ const LocationNavigator *locationNavigator() const { return m_navigator; }
+
+ /**
+ * Returns the current URL.
+ */
+ const KURL &url() const;
+
+ /**
+ * Returns the current history elements.
+ *
+ * @param index Variable to save the current history position to
+ * @return Current history element list
+ */
+ const QValueList<LocationNavigator::Element> history(int &index) const;
+
+ /**
+ * @overload
+ * Reimplemented from KFileView to support filtered views.
+ */
+ bool isSelected(const KFileItem *i) const;
+
+ /**
+ * Set the tree view widget to use for the tree.
+ *
+ * @param tree A valid tree view widget
+ */
+ void setTreeView(TreeView *tree);
+
+ /**
+ * Set the home URL.
+ *
+ * @param url URL to use as home URL
+ */
+ void setHomeUrl(const KURL &url);
+
+ /**
+ * Changes the "show hidden files" setting.
+ *
+ * @param value True to enable showing hidden files, false otherwise
+ */
+ void setShowHidden(bool value) { m_showHidden = value; }
+
+ /**
+ * Go one history hop back.
+ */
+ void goBack();
+
+ /**
+ * Go one history hop forward.
+ */
+ void goForward();
+
+ /**
+ * Go up in the directory structure.
+ */
+ void goUp();
+
+ /**
+ * Go the the predefined home URL.
+ */
+ void goHome();
+
+ /**
+ * Do item post-processing.
+ */
+ void endItemUpdates();
+
+ /**
+ * @overload
+ * Reimplemented from KFileDetailView.
+ */
+ void insertItem(KFileItem *fileItem);
+
+ /**
+ * Fetch a file item by its filename.
+ *
+ * @param file Item's filename
+ */
+ KFileItem *fileItem(const QString &filename);
+
+ /**
+ * Changes item's colors in the list view. Note that this overrides any
+ * highlight colors predefined by user filters.
+ *
+ * @param item The item to change colors for
+ * @param text Text color
+ * @param background Background color
+ */
+ void setItemColor(KFileItem *item, const QColor &text, const QColor &background);
+
+ /**
+ * Changes item's visibility in the list view.
+ *
+ * @param item The item tho change visiblity for
+ * @param visibility 1 if the item should be visible, 0 if it should be hidden, reverse otherwise
+ */
+ void setItemVisibility(KFileItem *item, int visibility = -1);
+
+ /**
+ * Mark or unmark the item. If the item is already marked it will be
+ * unmarked and vice-versa.
+ *
+ * @param item The item to mark
+ */
+ void markItem(KFileItem *item);
+
+ /**
+ * Mark or unmark the item identified by its filename. If the item is
+ * already marked it will be unmarked and vice-versa.
+ *
+ * @param filename Item's filename
+ */
+ void markItem(const QString &filename);
+
+ /**
+ * Unmark all items.
+ */
+ void unmarkItems();
+public slots:
+ /**
+ * Open an URL. Note that if a remote URL is specified the session needs to
+ * be connected to the specified host!
+ *
+ * @param url URL to open
+ */
+ void openUrl(const KURL &url);
+
+ /**
+ * Reload the current directory listing.
+ */
+ void reload();
+
+ /**
+ * Calculates new widths for all the columns.
+ */
+ void updateColumnWidths();
+
+ /**
+ * This method gets called when the widget is resized. It is used for automatic
+ * resize handling.
+ *
+ * @param width The new width
+ * @param height The new height
+ */
+ void resizeContents(int width, int height);
+
+ /**
+ * Returns the drag object to use for copy/paste and "drag and drop".
+ */
+ QDragObject *dragObject();
+protected:
+ /**
+ * Instruct the directory lister object to fetch the specified URL.
+ *
+ * @param url URL to fetch
+ * @param reload Should the cache be invalidated
+ */
+ void fetchLocation(const KURL &url, bool reload = false);
+
+ /**
+ * This method gets called when the widget is resized. It is used for automatic
+ * resize handling.
+ */
+ void resizeEvent(QResizeEvent *event);
+
+ /**
+ * Returns true if the drop event should be accepted.
+ */
+ bool acceptDrag(QDropEvent *event) const;
+
+ /**
+ * Called when something acceptable gets dropped on us.
+ */
+ void contentsDropEvent(QDropEvent *event);
+private:
+ class ListViewItem : public KFileListViewItem {
+ public:
+ ListViewItem(QListView *parent, KFileItem *fileItem);
+
+ /**
+ * @overload
+ * Reimplemented from KListView to implement nicer items.
+ */
+ void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment);
+
+ /**
+ * Set a text color for this item.
+ *
+ * @param color Text color
+ */
+ void setColor(QColor color) { m_textColor = color; }
+
+ /**
+ * Set a background color for this item.
+ *
+ * @param color Background color
+ */
+ void setBackground(QColor color) { m_backgroundColor = color; }
+
+ /**
+ * Set marked state for this item.
+ *
+ * @param marked True if this item should be marked, false otherwise
+ */
+ void markItem(bool marked);
+
+ /**
+ * Returns true if this item is marked.
+ */
+ bool marked() const { return m_marked; }
+ private:
+ QColor m_textColor;
+ QColor m_backgroundColor;
+ bool m_marked;
+ };
+
+ View *m_view;
+ DirLister *m_dirLister;
+ LocationNavigator *m_navigator;
+ TreeView *m_treeView;
+ QTimer *m_resizeTimer;
+
+ bool m_refreshing;
+ bool m_showHidden;
+ bool m_shouldDisableResize;
+ bool m_autoResizeEnabled;
+protected slots:
+ void slotClear();
+ void slotCompleted();
+ void slotDeleteItem(KFileItem *item);
+ void slotRefreshItems();
+ void slotSiteChanged(const KURL &url);
+
+ void slotUrlChanged(const KURL &url);
+
+ /**
+ * This slot gets called when an item has been renamed.
+ */
+ void slotItemRenamed(QListViewItem *item, const QString &name);
+
+ void slotContentsMoving(int x, int y);
+
+ /**
+ * This slot gets called when a context menu should be displayed.
+ */
+ void slotContextMenu(KListView*, QListViewItem *i, const QPoint &p);
+
+ /**
+ * This slot gets called when an item has been clicked.
+ */
+ void slotItemExecuted();
+
+ /**
+ * This slot gets called when a section in listview's header is resized. This
+ * is needed for proper automatic resize handling.
+ *
+ * @param section The section that was resized
+ */
+ void slotHeaderResized(int section);
+signals:
+ /**
+ * This signals gets emitted when user scrolls the widget.
+ *
+ * @param x New X position
+ * @param y New Y position
+ */
+ void contentsMoved(int x, int y);
+
+ /**
+ * This signal is emitted when items change.
+ */
+ void itemsChanged();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/dirlister.cpp b/kftpgrabber/src/widgets/browser/dirlister.cpp
new file mode 100644
index 0000000..4d539e4
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/dirlister.cpp
@@ -0,0 +1,169 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "dirlister.h"
+
+#include "engine/thread.h"
+#include "engine/cache.h"
+
+#include "kftpsession.h"
+
+#include <kmessagebox.h>
+#include <klocale.h>
+
+using namespace KFTPEngine;
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+DirLister::DirLister(QObject *parent)
+ : QObject(parent)
+{
+ m_localLister = new KDirLister();
+ m_localLister->setAutoUpdate(true);
+
+ enableLocal();
+}
+
+DirLister::~DirLister()
+{
+ delete m_localLister;
+}
+
+void DirLister::setSession(KFTPSession::Session *session)
+{
+ m_remoteSession = session;
+}
+
+void DirLister::fetchLocation(const KURL &url, bool reload)
+{
+ if (m_url.isLocalFile() != url.isLocalFile())
+ emit siteChanged(url);
+
+ m_url = url;
+
+ if (url.isLocalFile()) {
+ enableLocal();
+
+ m_localLister->stop();
+ m_localLister->setShowingDotFiles(m_showHidden);
+ m_localLister->openURL(url, false, reload);
+ } else {
+ enableRemote();
+
+ if (reload) {
+ KURL tmp = url;
+ Cache::self()->invalidateEntry(tmp);
+ }
+
+ emit clear();
+ m_remoteSession->getClient()->list(url);
+ }
+}
+
+void DirLister::enableLocal()
+{
+ m_localLister->stop();
+ m_localLister->QObject::disconnect(this);
+
+ connect(m_localLister, SIGNAL(clear()), this, SIGNAL(clear()));
+ connect(m_localLister, SIGNAL(completed()), this, SIGNAL(completed()));
+ connect(m_localLister, SIGNAL(deleteItem(KFileItem*)), this, SIGNAL(deleteItem(KFileItem*)));
+ connect(m_localLister, SIGNAL(refreshItems(const KFileItemList&)), this, SIGNAL(refreshItems()));
+}
+
+void DirLister::enableRemote()
+{
+ m_localLister->stop();
+ m_localLister->QObject::disconnect(this);
+ m_remoteSession->getClient()->eventHandler()->QObject::disconnect(this);
+
+ connect(m_remoteSession->getClient()->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), this, SLOT(slotRemoteEngineEvent(KFTPEngine::Event*)));
+}
+
+void DirLister::disableRemote()
+{
+ m_remoteSession->getClient()->eventHandler()->QObject::disconnect(this);
+}
+
+void DirLister::stop()
+{
+ if (m_url.isLocalFile())
+ m_localLister->stop();
+}
+
+KFileItemList DirLister::items() const
+{
+ if (m_url.isLocalFile())
+ return m_localLister->items();
+ else
+ return m_items;
+}
+
+void DirLister::slotRemoteEngineEvent(KFTPEngine::Event *event)
+{
+ switch (event->type()) {
+ case Event::EventError: {
+ KMessageBox::error(0, i18n("Could not enter folder %1.").arg(m_url.path()), i18n("Error"));
+ disableRemote();
+ break;
+ }
+ case Event::EventDirectoryListing: {
+ m_items.clear();
+
+ // Populate the item list
+ QValueList<DirectoryEntry> list = event->getParameter(0).asDirectoryListing().list();
+ QValueList<DirectoryEntry>::ConstIterator end(list.end());
+ for (QValueList<DirectoryEntry>::ConstIterator i(list.begin()); i != end; ++i) {
+ if (!m_showHidden && (*i).filename().at(0) == '.')
+ continue;
+
+ m_items.append(new KFileItem((*i).toUdsEntry(), m_url, false, true));
+ }
+
+ disableRemote();
+ emit completed();
+ break;
+ }
+ default: break;
+ }
+}
+
+}
+
+}
+
+#include "dirlister.moc"
diff --git a/kftpgrabber/src/widgets/browser/dirlister.h b/kftpgrabber/src/widgets/browser/dirlister.h
new file mode 100644
index 0000000..730704f
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/dirlister.h
@@ -0,0 +1,157 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETS_BROWSERDIRLISTER_H
+#define KFTPWIDGETS_BROWSERDIRLISTER_H
+
+#include <qobject.h>
+
+#include <kurl.h>
+#include <kdirlister.h>
+
+namespace KFTPSession {
+ class Session;
+}
+
+namespace KFTPEngine {
+ class Event;
+}
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+/**
+ * This class is a wrapper around KDirLister to support remote listings
+ * via engine sockets.
+ *
+ * @author Jernej Kos
+ */
+class DirLister : public QObject {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent object
+ */
+ DirLister(QObject *parent);
+
+ /**
+ * Class destructor.
+ */
+ ~DirLister();
+
+ /**
+ * Set the remote session. You have to call this method before anything else
+ * in this class!
+ *
+ * @param session A valid session
+ */
+ void setSession(KFTPSession::Session *session);
+
+ /**
+ * Changes the "show hidden files" setting.
+ *
+ * @param value True to enable showing hidden files, false otherwise
+ */
+ void setShowingDotFiles(bool value) { m_showHidden = value; }
+
+ /**
+ * Fetch a specific location.
+ *
+ * @param url The URL to fetch (can be local or remote)
+ * @param reload If set to true listing cache will be invalidated
+ */
+ void fetchLocation(const KURL &url, bool reload);
+
+ /**
+ * Stop the current listing operation.
+ */
+ void stop();
+
+ /**
+ * Returns the items listed for the current URL. You should call this when receiving
+ * the finished() signal.
+ *
+ * @return The items listed for the current URL
+ */
+ KFileItemList items() const;
+protected:
+ void enableLocal();
+ void enableRemote();
+ void disableRemote();
+private:
+ KDirLister *m_localLister;
+ KFTPSession::Session *m_remoteSession;
+ KFileItemList m_items;
+ KURL m_url;
+ bool m_showHidden;
+private slots:
+ void slotRemoteEngineEvent(KFTPEngine::Event *event);
+signals:
+ /**
+ * Emitted when all items should be cleared.
+ */
+ void clear();
+
+ /**
+ * Emitted when the listing operation has been completed.
+ */
+ void completed();
+
+ /**
+ * Emitted when an item has to be removed.
+ */
+ void deleteItem(KFileItem *item);
+
+ /**
+ * Emitted when items should be refreshed.
+ */
+ void refreshItems();
+
+ /**
+ * Emitted when site changes from local to remote or vice-versa.
+ *
+ * @param url New site URL
+ */
+ void siteChanged(const KURL &url);
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/filterwidget.cpp b/kftpgrabber/src/widgets/browser/filterwidget.cpp
new file mode 100644
index 0000000..47f88d9
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/filterwidget.cpp
@@ -0,0 +1,118 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "browser/filterwidget.h"
+#include "browser/detailsview.h"
+
+#include <qlistview.h>
+#include <qregexp.h>
+#include <qpopupmenu.h>
+
+#include <klocale.h>
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+FilterWidget::FilterWidget(QWidget *parent, DetailsView *view)
+ : KListViewSearchLine(parent, view),
+ m_filterDirectories(true),
+ m_filterSymlinks(true),
+ m_caseSensitive(false)
+{
+ connect(view, SIGNAL(itemsChanged()), this, SLOT(updateSearch()));
+}
+
+bool FilterWidget::itemMatches(const QListViewItem *item, const QString &pattern) const
+{
+ if (!pattern.isEmpty()) {
+ const KFileListViewItem *i = dynamic_cast<const KFileListViewItem*>(item);
+
+ if (i) {
+ if (i->fileInfo()->isDir() && !m_filterDirectories)
+ return true;
+ else if (i->fileInfo()->isLink() && !m_filterSymlinks)
+ return true;
+ }
+
+ QRegExp filter(pattern);
+ filter.setCaseSensitive(m_caseSensitive);
+ filter.setWildcard(true);
+
+ return filter.search(item->text(0)) > -1;
+ }
+
+ return true;
+}
+
+QPopupMenu *FilterWidget::createPopupMenu()
+{
+ QPopupMenu *popup = KLineEdit::createPopupMenu();
+
+ QPopupMenu *subMenu = new QPopupMenu(popup);
+ connect(subMenu, SIGNAL(activated(int)), this, SLOT(slotOptionsMenuActivated(int)));
+
+ popup->insertSeparator();
+ popup->insertItem(i18n("Filter Options"), subMenu);
+
+ subMenu->insertItem(i18n("Filter Directories"), FilterWidget::FilterDirectories);
+ subMenu->setItemChecked(FilterWidget::FilterDirectories, m_filterDirectories);
+
+ subMenu->insertItem(i18n("Filter Symlinks"), FilterWidget::FilterSymlinks);
+ subMenu->setItemChecked(FilterWidget::FilterSymlinks, m_filterSymlinks);
+
+ subMenu->insertItem(i18n("Case Sensitive"), FilterWidget::CaseSensitive);
+ subMenu->setItemChecked(FilterWidget::CaseSensitive, m_caseSensitive);
+
+ return popup;
+}
+
+void FilterWidget::slotOptionsMenuActivated(int id)
+{
+ switch (id) {
+ case FilterDirectories: m_filterDirectories = !m_filterDirectories; break;
+ case FilterSymlinks: m_filterSymlinks = !m_filterSymlinks; break;
+ case CaseSensitive: m_caseSensitive = !m_caseSensitive; break;
+ default: break;
+ }
+
+ updateSearch();
+}
+
+}
+
+}
+
+#include "filterwidget.moc"
diff --git a/kftpgrabber/src/widgets/browser/filterwidget.h b/kftpgrabber/src/widgets/browser/filterwidget.h
new file mode 100644
index 0000000..f5429cf
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/filterwidget.h
@@ -0,0 +1,97 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETS_BROWSERFILTERWIDGET_H
+#define KFTPWIDGETS_BROWSERFILTERWIDGET_H
+
+#include <klistviewsearchline.h>
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class DetailsView;
+
+/**
+ * This class is a simple filtering widget that accepts wildcard
+ * patterns and filters listviews. Note that this widget only
+ * filters on the first column.
+ *
+ * @author Jernej Kos <kostko@jweb-network.net>
+ */
+class FilterWidget : public KListViewSearchLine {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent widget
+ * @param view The view you want to filter
+ */
+ FilterWidget(QWidget *parent, DetailsView *view);
+protected:
+ enum {
+ FilterDirectories = 1,
+ FilterSymlinks = 2,
+ CaseSensitive = 3
+ };
+
+ /**
+ * @overload
+ * Reimplemented from KListViewSearchLine to support wildcard
+ * matching schemes.
+ */
+ bool itemMatches(const QListViewItem *item, const QString &pattern) const;
+
+ /**
+ * @overload
+ * Reimplemented from KListViewSearchLine to remove multiple
+ * columns selection, since this widget only operates on the
+ * first column.
+ */
+ QPopupMenu *createPopupMenu();
+private:
+ bool m_filterDirectories;
+ bool m_filterSymlinks;
+ bool m_caseSensitive;
+private slots:
+ void slotOptionsMenuActivated(int id);
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/locationnavigator.cpp b/kftpgrabber/src/widgets/browser/locationnavigator.cpp
new file mode 100644
index 0000000..5be8004
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/locationnavigator.cpp
@@ -0,0 +1,173 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "locationnavigator.h"
+#include "detailsview.h"
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+LocationNavigator::Element::Element()
+ : m_url(),
+ m_currentFilename(),
+ m_contentsX(0),
+ m_contentsY(0)
+{
+}
+
+LocationNavigator::Element::Element(const KURL &url)
+ : m_url(url),
+ m_currentFilename(),
+ m_contentsX(0),
+ m_contentsY(0)
+{
+}
+
+LocationNavigator::LocationNavigator(DetailsView *view)
+ : m_view(view),
+ m_historyIndex(0)
+{
+ connect(view, SIGNAL(contentsMoved(int, int)), this, SLOT(slotContentsMoved(int, int)));
+}
+
+void LocationNavigator::setUrl(const KURL &url)
+{
+ if (m_historyIndex > 0) {
+ const KURL &nextUrl = m_history[m_historyIndex - 1].url();
+
+ if (url == nextUrl) {
+ goForward();
+ return;
+ }
+ }
+
+ // Check for duplicates
+ const KURL &currentUrl = m_history[m_historyIndex].url();
+ if (currentUrl == url)
+ return;
+
+ updateCurrentElement();
+
+ const QValueListIterator<LocationNavigator::Element> i = m_history.at(m_historyIndex);
+ m_history.insert(i, Element(url));
+
+ emit urlChanged(url);
+ emit historyChanged();
+
+ // Cleanup history when it becomes too big
+ if (m_historyIndex > 100) {
+ m_history.erase(m_history.begin());
+ m_historyIndex--;
+ }
+}
+
+const KURL& LocationNavigator::url() const
+{
+ return m_history[m_historyIndex].url();
+}
+
+const QValueList<LocationNavigator::Element> LocationNavigator::history(int &index) const
+{
+ index = m_historyIndex;
+ return m_history;
+}
+
+void LocationNavigator::goBack()
+{
+ updateCurrentElement();
+ const int count = m_history.count();
+
+ if (m_historyIndex < count - 1) {
+ m_historyIndex++;
+
+ emit urlChanged(url());
+ emit historyChanged();
+ }
+}
+
+void LocationNavigator::goForward()
+{
+ if (m_historyIndex > 0) {
+ m_historyIndex--;
+
+ emit urlChanged(url());
+ emit historyChanged();
+ }
+}
+
+void LocationNavigator::goUp()
+{
+ setUrl(url().upURL());
+}
+
+void LocationNavigator::goHome()
+{
+ setUrl(m_homeUrl);
+}
+
+void LocationNavigator::clear()
+{
+ Element element = m_history[m_historyIndex];
+
+ m_history.clear();
+ m_historyIndex = 0;
+
+ m_history.append(element);
+}
+
+void LocationNavigator::slotContentsMoved(int x, int y)
+{
+ m_history[m_historyIndex].setContentsX(x);
+ m_history[m_historyIndex].setContentsY(y);
+}
+
+void LocationNavigator::updateCurrentElement()
+{
+ const KFileItem *item = m_view->currentFileItem();
+
+ if (item)
+ m_history[m_historyIndex].setCurrentFilename(item->name());
+
+ m_history[m_historyIndex].setContentsX(m_view->contentsX());
+ m_history[m_historyIndex].setContentsY(m_view->contentsY());
+}
+
+}
+
+}
+
+#include "locationnavigator.moc"
+
diff --git a/kftpgrabber/src/widgets/browser/locationnavigator.h b/kftpgrabber/src/widgets/browser/locationnavigator.h
new file mode 100644
index 0000000..475a3af
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/locationnavigator.h
@@ -0,0 +1,210 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETS_BROWSERLOCATIONNAVIGATOR_H
+#define KFTPWIDGETS_BROWSERLOCATIONNAVIGATOR_H
+
+#include <qobject.h>
+#include <qvaluelist.h>
+
+#include <kurl.h>
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class DetailsView;
+
+/**
+ * This class contains the current navigational history and enables
+ * moving through it.
+ *
+ * @author Jernej Kos
+ */
+class LocationNavigator : public QObject {
+Q_OBJECT
+public:
+ /**
+ * An Element instance represents one history element. The class contains
+ * information about the URL, the selected item and the contents position.
+ */
+ class Element {
+ public:
+ /**
+ * Class constructor.
+ */
+ Element();
+
+ /**
+ * Class constructor.
+ *
+ * @param url Element's URL
+ */
+ Element(const KURL &url);
+
+ /**
+ * Returns the element's URL.
+ */
+ const KURL &url() const { return m_url; }
+
+ /**
+ * Set currently selected filename.
+ *
+ * @param filename The filename of the currently selected item
+ */
+ void setCurrentFilename(const QString &filename) { m_currentFilename = filename; }
+
+ /**
+ * Returns the selected filename.
+ */
+ const QString &currentFilename() const { return m_currentFilename; }
+
+ /**
+ * Set current contents X position.
+ *
+ * @param x Contents X position
+ */
+ void setContentsX(int x) { m_contentsX = x; }
+
+ /**
+ * Returns the saved contents X position.
+ */
+ int contentsX() const { return m_contentsX; }
+
+ /**
+ * Set current contents Y position.
+ *
+ * @param y Contents Y position
+ */
+ void setContentsY(int y) { m_contentsY = y; }
+
+ /**
+ * Returns the saved contents Y position.
+ */
+ int contentsY() const { return m_contentsY; }
+ private:
+ KURL m_url;
+ QString m_currentFilename;
+
+ int m_contentsX;
+ int m_contentsY;
+ };
+
+ /**
+ * Class constructor.
+ *
+ * @param view Parent view
+ */
+ LocationNavigator(DetailsView *view);
+
+ /**
+ * Set a new current URL. Calling this will emit the urlChanged signal.
+ *
+ * @param url Wanted URL
+ */
+ void setUrl(const KURL &url);
+
+ /**
+ * Returns the current URL.
+ */
+ const KURL &url() const;
+
+ /**
+ * Returns the current history elements.
+ *
+ * @param index Variable to save the current history position to
+ * @return Current history element list
+ */
+ const QValueList<Element> history(int &index) const;
+
+ /**
+ * Go one history hop back.
+ */
+ void goBack();
+
+ /**
+ * Go one history hop forward.
+ */
+ void goForward();
+
+ /**
+ * Go up in the directory structure.
+ */
+ void goUp();
+
+ /**
+ * Go the the predefined home URL.
+ */
+ void goHome();
+
+ /**
+ * Set the home URL.
+ *
+ * @param url URL to use as home URL
+ */
+ void setHomeUrl(const KURL &url) { m_homeUrl = url; }
+
+ /**
+ * Clear current history.
+ */
+ void clear();
+signals:
+ /**
+ * This signal is emitted whenever the current URL changes.
+ *
+ * @param url The new URL
+ */
+ void urlChanged(const KURL &url);
+
+ /**
+ * This signal is emitted whenever the history is updated.
+ */
+ void historyChanged();
+private slots:
+ void slotContentsMoved(int x, int y);
+private:
+ DetailsView *m_view;
+ int m_historyIndex;
+ QValueList<Element> m_history;
+ KURL m_homeUrl;
+
+ void updateCurrentElement();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/propsplugin.cpp b/kftpgrabber/src/widgets/browser/propsplugin.cpp
new file mode 100644
index 0000000..b6e688d
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/propsplugin.cpp
@@ -0,0 +1,360 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "browser/propsplugin.h"
+#include "kftpsession.h"
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qstyle.h>
+#include <qgroupbox.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kseparator.h>
+#include <ksqueezedtextlabel.h>
+
+using namespace KFTPEngine;
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+PropsPlugin::PropsPlugin(KPropertiesDialog *props, KFileItemList items)
+ : KPropsDlgPlugin(props)
+{
+ QFrame *frame = properties->addPage(i18n("&General"));
+ frame->setMinimumWidth(320);
+ frame->setMinimumHeight(300);
+
+ // Some differences between a single file and multiple files
+ KFileItem *item = items.at(0);
+ KURL fileUrl = item->url();
+ filesize_t fileSize = item->size();
+ QString nameText;
+ QString iconText;
+ QString mimeComment;
+
+ if (items.count() == 1) {
+ bool isDir = false;
+
+ // Guess file type
+ if (item->isDir()) {
+ iconText = "folder";
+ isDir = true;
+ mimeComment = i18n("Remote folder");
+ } else if (item->isLink()) {
+ // We can't know if the sym-linked file is realy a directory, but most of
+ // the time it is. So if we can't determine the MIME type, set it to directory.
+ KMimeType::Ptr mimeType = KMimeType::findByURL(fileUrl, 0, false, true);
+
+ if (mimeType->name() == KMimeType::defaultMimeType()) {
+ iconText = "folder";
+ isDir = true;
+ mimeComment = i18n("Remote folder");
+ } else {
+ iconText = mimeType->icon(QString::null, false);
+ mimeComment = mimeType->comment();
+ }
+ } else {
+ KMimeType::Ptr mimeType = KMimeType::findByURL(fileUrl, 0, false, true);
+ iconText = mimeType->icon(QString::null, false);
+ mimeComment = mimeType->comment();
+ }
+
+ if (mimeComment.isEmpty()) {
+ mimeComment = i18n("Unknown");
+ }
+
+ nameText = item->name();
+ } else {
+ // Count files and folders selected
+ int countFiles = 0;
+ int countFolders = 0;
+ fileSize = 0;
+
+ KFileItemListIterator i(items);
+ for (; i.current(); ++i) {
+ if ((*i)->isDir())
+ countFolders++;
+ else
+ countFiles++;
+
+ fileSize += (*i)->size();
+ }
+
+ iconText = "kmultiple";
+ nameText = KIO::itemsSummaryString(countFiles + countFolders, countFiles, countFolders, 0, false);
+ }
+
+ QVBoxLayout *vbl = new QVBoxLayout(frame, 0, KDialog::spacingHint(), "vbl");
+ QGridLayout *grid = new QGridLayout(0, 3);
+ grid->setColStretch(0, 0);
+ grid->setColStretch(1, 0);
+ grid->setColStretch(2, 1);
+ grid->addColSpacing(1, KDialog::spacingHint());
+ vbl->addLayout(grid);
+
+ // Display file name and icon
+ QLabel *iconLabel = new QLabel(frame);
+ int bsize = 66 + 2 * iconLabel->style().pixelMetric(QStyle::PM_ButtonMargin);
+ iconLabel->setFixedSize(bsize, bsize);
+ iconLabel->setPixmap(DesktopIcon(iconText));
+ grid->addWidget(iconLabel, 0, 0, AlignLeft);
+
+ QLabel *nameLabel = new QLabel(frame);
+ nameLabel->setText(nameText);
+ grid->addWidget(nameLabel, 0, 2);
+
+ KSeparator *sep = new KSeparator(KSeparator::HLine, frame);
+ grid->addMultiCellWidget(sep, 2, 2, 0, 2);
+
+ // Display file information
+ QLabel *l;
+ int currentRow = 3;
+
+ if (items.count() == 1) {
+ l = new QLabel(i18n("Type:"), frame);
+ grid->addWidget(l, currentRow, 0);
+
+ l = new QLabel(mimeComment, frame);
+ grid->addWidget(l, currentRow++, 2);
+ }
+
+ l = new QLabel(i18n("Location:"), frame);
+ grid->addWidget(l, currentRow, 0);
+
+ l = new KSqueezedTextLabel(frame);
+ l->setText(fileUrl.directory());
+ grid->addWidget(l, currentRow++, 2);
+
+ l = new QLabel(i18n("Size:"), frame);
+ grid->addWidget(l, currentRow, 0);
+
+ l = new QLabel(frame);
+ grid->addWidget(l, currentRow++, 2);
+
+ l->setText(QString::fromLatin1("%1 (%2)").arg(KIO::convertSize(fileSize))
+ .arg(KGlobal::locale()->formatNumber(fileSize, 0)));
+
+ sep = new KSeparator(KSeparator::HLine, frame);
+ grid->addMultiCellWidget(sep, currentRow, currentRow, 0, 2);
+ currentRow++;
+
+ // Display modification time
+ if (items.count() == 1) {
+ l = new QLabel(i18n("Created:"), frame);
+ grid->addWidget(l, currentRow, 0);
+
+ QDateTime dt;
+ dt.setTime_t(item->time(KIO::UDS_MODIFICATION_TIME));
+ l = new QLabel(KGlobal::locale()->formatDateTime(dt), frame);
+ grid->addWidget(l, currentRow++, 2);
+ }
+
+ vbl->addStretch(1);
+}
+
+void PropsPlugin::applyChanges()
+{
+}
+
+mode_t PermissionsPropsPlugin::fperm[3][4] = {
+ {S_IRUSR, S_IWUSR, S_IXUSR, S_ISUID},
+ {S_IRGRP, S_IWGRP, S_IXGRP, S_ISGID},
+ {S_IROTH, S_IWOTH, S_IXOTH, S_ISVTX}
+};
+
+PermissionsPropsPlugin::PermissionsPropsPlugin(KPropertiesDialog *_props, KFileItemList items, KFTPSession::Session *session)
+ : KPropsDlgPlugin(_props),
+ m_items(items),
+ m_session(session),
+ m_cbRecursive(0)
+{
+ QFrame *frame = properties->addPage(i18n("&Permissions"));
+ frame->setMinimumWidth(320);
+ frame->setMinimumHeight(300);
+
+ // Some differences between a single file and multiple files
+ KFileItem *item = items.at(0);
+ KURL fileUrl = item->url();
+ bool isDir = false;
+
+ if (items.count() == 1) {
+ // Guess file type
+ if (item->isDir()) {
+ isDir = true;
+ } else if (item->isLink()) {
+ // We can't know if the sym-linked file is realy a directory, but most of
+ // the time it is. So if we can't determine the MIME type, set it to directory.
+ KMimeType::Ptr mimeType = KMimeType::findByURL(fileUrl, 0, false, true);
+
+ if (mimeType->name() == KMimeType::defaultMimeType())
+ isDir = true;
+ }
+ } else {
+ // Check for directories
+ KFileItemListIterator i(items);
+ for (; i.current(); ++i) {
+ if ((*i)->isDir()) {
+ isDir = true;
+ break;
+ }
+ }
+ }
+
+ QBoxLayout *box = new QVBoxLayout(frame, 0, KDialog::spacingHint());
+
+ QGroupBox *gb = new QGroupBox(0, Qt::Vertical, i18n("Access Permissions"), frame);
+ gb->layout()->setSpacing(KDialog::spacingHint());
+ gb->layout()->setMargin(KDialog::marginHint());
+ box->addWidget(gb);
+
+ QGridLayout *gl = new QGridLayout(gb->layout(), 6, 6, 15);
+
+ QLabel *l = new QLabel(i18n("Class"), gb);
+ gl->addWidget(l, 1, 0);
+
+ if (isDir)
+ l = new QLabel(i18n("Show\nEntries"), gb);
+ else
+ l = new QLabel(i18n("Read"), gb);
+ gl->addWidget(l, 1, 1);
+
+ if (isDir)
+ l = new QLabel(i18n("Write\nEntries"), gb);
+ else
+ l = new QLabel(i18n("Write"), gb);
+ gl->addWidget(l, 1, 2);
+
+ if (isDir)
+ l = new QLabel(i18n("Enter folder", "Enter"), gb);
+ else
+ l = new QLabel(i18n("Exec"), gb);
+
+ QSize size = l->sizeHint();
+ size.setWidth(size.width() + 15);
+ l->setFixedSize(size);
+ gl->addWidget(l, 1, 3);
+
+ l = new QLabel(i18n("Special"), gb);
+ gl->addMultiCellWidget(l, 1, 1, 4, 5);
+
+ l = new QLabel(i18n("User"), gb);
+ gl->addWidget(l, 2, 0);
+
+ l = new QLabel(i18n("Group"), gb);
+ gl->addWidget(l, 3, 0);
+
+ l = new QLabel(i18n("Others"), gb);
+ gl->addWidget(l, 4, 0);
+
+ l = new QLabel(i18n("Set UID"), gb);
+ gl->addWidget(l, 2, 5);
+
+ l = new QLabel(i18n("Set GID"), gb);
+ gl->addWidget(l, 3, 5);
+
+ l = new QLabel(i18n("Sticky"), gb);
+ gl->addWidget(l, 4, 5);
+
+ mode_t permissions = item->permissions();
+
+ // Display checkboxes
+ for (int row = 0; row < 3; ++row) {
+ for (int col = 0; col < 4; ++col) {
+ QCheckBox *cb = new QCheckBox(gb);
+ connect(cb, SIGNAL(clicked()), this, SLOT(setDirty()));
+ m_permsCheck[row][col] = cb;
+ cb->setChecked(permissions & fperm[row][col]);
+
+ gl->addWidget(cb, row + 2, col + 1);
+ }
+ }
+
+ gl->setColStretch(6, 10);
+ box->addStretch(10);
+
+ if (isDir) {
+ m_cbRecursive = new QCheckBox(i18n("Apply changes to all subfolders and their contents"), frame);
+ connect(m_cbRecursive, SIGNAL(clicked()), this, SLOT(changed()));
+ box->addWidget(m_cbRecursive);
+ }
+}
+
+void PermissionsPropsPlugin::applyChanges()
+{
+ // Generate new permissions =)
+ int newPerms[4] = {0,};
+
+ for (int row = 0; row < 3; ++row) {
+ for (int col = 0; col < 4; ++col) {
+ if (!m_permsCheck[row][col]->isChecked()) continue;
+
+ int x = col < 3 ? col : row;
+ int c = 0;
+
+ switch (x) {
+ case 0: c = 4; break;
+ case 1: c = 2; break;
+ case 2: c = 1; break;
+ }
+
+ if (col < 3) {
+ newPerms[row + 1] += c;
+ } else {
+ newPerms[0] += c;
+ }
+ }
+ }
+
+ // Actually do a chmod
+ int mode = newPerms[0] * 1000 + newPerms[1] * 100 + newPerms[2] * 10 + newPerms[3];
+ bool recursive = m_cbRecursive && m_cbRecursive->isChecked();
+
+ KFileItemListIterator i(m_items);
+ for (; i.current(); ++i) {
+ if ((*i)->isDir())
+ m_session->getClient()->chmod((*i)->url(), mode, recursive);
+ else
+ m_session->getClient()->chmod((*i)->url(), mode);
+ }
+}
+
+}
+
+}
+
+#include "propsplugin.moc"
diff --git a/kftpgrabber/src/widgets/browser/propsplugin.h b/kftpgrabber/src/widgets/browser/propsplugin.h
new file mode 100644
index 0000000..9283f85
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/propsplugin.h
@@ -0,0 +1,98 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPFILEPROPSPLUGIN_H
+#define KFTPFILEPROPSPLUGIN_H
+
+#include "engine/directorylisting.h"
+
+#include <qcheckbox.h>
+#include <kpropertiesdialog.h>
+
+namespace KFTPSession {
+ class Session;
+}
+
+namespace KFTPEngine {
+ class Thread;
+}
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+/**
+ * This is a plugin for displaying remote file properties using the
+ * standard KDE file properties dialog.
+ *
+ * @author Jernej Kos
+ */
+class PropsPlugin : public KPropsDlgPlugin
+{
+Q_OBJECT
+public:
+ PropsPlugin(KPropertiesDialog *props, KFileItemList items);
+
+ void applyChanges();
+};
+
+/**
+ * This is a plugin for displaying remote file permissions and their
+ * changing using the standard KDE file properties dialog.
+ *
+ * @author Jernej Kos
+ */
+class PermissionsPropsPlugin : public KPropsDlgPlugin
+{
+Q_OBJECT
+public:
+ PermissionsPropsPlugin(KPropertiesDialog *props, KFileItemList items, KFTPSession::Session *session);
+
+ void applyChanges();
+private:
+ KFileItemList m_items;
+ KFTPSession::Session *m_session;
+
+ static mode_t fperm[3][4];
+ QString m_perms[3];
+ QCheckBox *m_permsCheck[3][4];
+ QCheckBox *m_cbRecursive;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/treeview.cpp b/kftpgrabber/src/widgets/browser/treeview.cpp
new file mode 100644
index 0000000..0f2a824
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/treeview.cpp
@@ -0,0 +1,520 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "browser/treeview.h"
+#include "browser/view.h"
+
+#include "engine/thread.h"
+
+#include "misc.h"
+
+#include <qheader.h>
+#include <qtimer.h>
+
+#include <kio/job.h>
+#include <kurl.h>
+#include <kurldrag.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+/*
+ * TreeViewItem class
+ */
+
+TreeViewItem::TreeViewItem(TreeView *parent, const KURL &url)
+ : QListViewItem(parent),
+ m_tree(parent),
+ m_url(url),
+ m_dirty(false)
+{
+ // Set the name
+ setText(0, path2Name(url.path(-1)));
+}
+
+TreeViewItem::TreeViewItem(TreeView *tree, QListViewItem *parent, const KURL &url)
+ : QListViewItem(parent),
+ m_tree(tree),
+ m_url(url),
+ m_dirty(false)
+{
+ // Set the name
+ setText(0, path2Name(url.path(-1)));
+}
+
+TreeViewItem::~TreeViewItem()
+{
+ // The item should be removed from the list as well
+ m_tree->m_treeItems.remove(m_url.path());
+}
+
+int TreeViewItem::compare(QListViewItem *i, int col, bool) const
+{
+ // Hidden files must be on top
+ if (m_url.fileName().at(0) == '.')
+ return -1;
+
+ return QListViewItem::compare(i, col, false);
+}
+
+/*
+ * TreeView class
+ */
+
+TreeView::TreeView(QWidget *parent)
+ : KListView(parent)
+{
+ // Create the columns
+ addColumn(i18n("Directory"));
+
+ // General tree settings
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setMinimumWidth(150);
+ setRootIsDecorated(false);
+ header()->hide();
+
+ // Reset the view
+ resetView(KURL("/"));
+ m_noItemOpen = false;
+
+ // Connect signals
+ connect(this, SIGNAL(clicked(QListViewItem*)), this, SLOT(slotClicked(QListViewItem*)));
+ connect(this, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(slotDoubleClicked(QListViewItem*)));
+
+ // Drag and drop
+ m_dropItem = 0L;
+}
+
+
+TreeView::~TreeView()
+{
+ // Free the item index
+ m_treeItems.clear();
+}
+
+void TreeView::resetView(const KURL &url)
+{
+ // Free the item index
+ m_treeItems.clear();
+
+ // Clear the view
+ clear();
+ header()->resizeSection(0, 0);
+
+ // Create the root item
+ TreeViewItem *rootItem = new TreeViewItem(this, remoteUrl("/", url));
+ rootItem->setText(0, url.isLocalFile() ? i18n("Root directory") : url.host());
+ rootItem->setPixmap(0, loadSmallPixmap("folder_red"));
+ setOpen(rootItem, true);
+}
+
+int TreeView::openUrl(const KURL &url, QListViewItem *parent)
+{
+ // Root item should always be open
+ setOpen(firstChild(), true);
+
+ // Go trough all items in the list and try to find the url
+ QListViewItem *item;
+ if (!parent)
+ item = firstChild();
+ else
+ item = parent;
+
+ while (item) {
+ // Check if the item is correct
+ if (static_cast<TreeViewItem*>(item)->m_url.path(-1) == url.path(-1)) {
+ // We have found it
+ ensureItemVisible(item);
+ setCurrentItem(item);
+ setSelected(item, true);
+
+ // Change viewport
+ QRect r = itemRect(item);
+ if (r.isValid()) {
+ int x, y;
+ viewportToContents(contentsX(), r.y(), x, y);
+ setContentsPos(x, y);
+ }
+
+ return 1;
+ }
+
+ if (item->firstChild()) {
+ // If item has children, go after them
+ if (openUrl(url, item->firstChild()) == 1)
+ return 1;
+ }
+
+ item = item->nextSibling();
+ }
+
+ return 0;
+}
+
+QListViewItem *TreeView::findItem(QListViewItem *parent, const QString &name)
+{
+ QListViewItem *item = parent->firstChild();
+
+ while (item) {
+ if (item->text(0) == name)
+ return item;
+
+ item = item->nextSibling();
+ }
+
+ // If nothing is found, parent should be returned
+ return parent;
+}
+
+void TreeView::createFolder(const KURL &url, QPixmap icon)
+{
+ int numDirs = url.path(1).contains('/', false);
+ QListViewItem *item = firstChild();
+
+ for (int i = 1; i < numDirs; i++) {
+ QString itemUrl = url.path().section('/', 0, i);
+
+ if (m_treeItems[itemUrl]) {
+ // Item exists for this URL
+ item = m_treeItems[itemUrl];
+ } else {
+ // Item not yet created
+ KURL tmp = url;
+ tmp.setPath(itemUrl);
+
+ item = new TreeViewItem(this, item, tmp);
+ if (i == numDirs - 1)
+ item->setPixmap(0, icon);
+ else
+ item->setPixmap(0, loadSmallPixmap("folder"));
+
+ m_treeItems.insert(itemUrl, static_cast<TreeViewItem*>(item));
+ }
+
+ // Mark it as dirty
+ static_cast<TreeViewItem*>(item)->m_dirty = true;
+
+ // Open it
+ if (!m_noItemOpen)
+ setOpen(item, true);
+ }
+
+ // Root item should always be open
+ setOpen(firstChild(), true);
+}
+
+void TreeView::endUpdate(const KURL &url)
+{
+ // Remove all items in the selected dir, not marked as dirty
+ TreeViewItem *top = static_cast<TreeViewItem*>(firstChild());
+ TreeViewItem *tmp = 0L;
+ int numDirs = url.path(1).contains('/', false);
+
+ if (url.path() == "/") {
+ TreeViewItem *i = static_cast<TreeViewItem*>(top->firstChild());
+
+ while (i) {
+ tmp = static_cast<TreeViewItem*>(i->nextSibling());
+
+ if (!i->m_dirty) {
+ // Remove item from the index
+ delete i;
+ } else {
+ i->m_dirty = false;
+ }
+
+ i = tmp;
+ }
+
+ return;
+ }
+
+ // URL for items
+ KURL itemURL = url;
+ itemURL.setPath("/");
+
+ for (int i = 1; i < numDirs; i++) {
+ QString sect = url.path().section('/', i, i);
+ itemURL.setPath(url.path().section('/', 0, i));
+
+ if (!m_treeItems[itemURL.path()]) {
+ // Item not yet created
+ return;
+ } else {
+ // Item is already present
+ top = m_treeItems[itemURL.path()];
+
+ // Check for URL match
+ if (itemURL.path(-1) == url.path(-1)) {
+ // URL match, delete the item's children
+ TreeViewItem *i = static_cast<TreeViewItem*>(top->firstChild());
+
+ while (i) {
+ tmp = static_cast<TreeViewItem*>(i->nextSibling());
+
+ if (!i->m_dirty) {
+ // Remove item from the index
+ delete i;
+ } else {
+ i->m_dirty = false;
+ }
+
+ i = tmp;
+ }
+ return;
+ }
+ }
+ }
+}
+
+void TreeView::clearFolder(const KURL &url)
+{
+ // Remove url's children
+ QListViewItem *top = firstChild();
+ int numDirs = url.path(1).contains('/', false);
+
+ if (url.path() == "/") {
+ QListViewItem *i = top->firstChild();
+
+ while (i) {
+ // Remove item from the index
+ delete i;
+
+ i = top->firstChild();
+ }
+
+ return;
+ }
+
+ // URL for items
+ KURL itemURL = url;
+ itemURL.setPath("/");
+
+ for (int i = 1; i < numDirs; i++) {
+ QString sect = url.path().section('/', i, i);
+ itemURL.setPath(url.path().section('/', 0, i));
+
+ if (!m_treeItems[itemURL.path()]) {
+ // Item not yet created
+ return;
+ } else {
+ // Item is already present
+ top = m_treeItems[itemURL.path()];
+
+ // Check for URL match
+ if (itemURL.path(-1) == url.path(-1)) {
+ // URL match, delete the item's children
+ QListViewItem *i = top->firstChild();
+
+ while (i) {
+ // Remove item from the index
+ delete i;
+
+ i = top->firstChild();
+ }
+ return;
+ }
+ }
+ }
+}
+
+void TreeView::removeFolder(const KURL &url)
+{
+ // Removes a folder at url
+ QListViewItem *top = firstChild();
+ int numDirs = url.path(1).contains('/', false);
+
+ // URL for items
+ KURL itemURL = url;
+ itemURL.setPath("/");
+
+ for (int i = 1; i < numDirs; i++) {
+ QString sect = url.path().section('/', i, i);
+ itemURL.setPath(url.path().section('/', 0, i));
+
+ if (!m_treeItems[itemURL.path()]) {
+ // Item not yet created
+ return;
+ } else {
+ // Item is already present
+ top = m_treeItems[itemURL.path()];
+
+ // Check for URL match
+ if (itemURL.path(-1) == url.path(-1)) {
+ // Remove item from the index
+ delete top;
+
+ return;
+ }
+ }
+ }
+}
+
+void TreeView::slotClicked(QListViewItem *item)
+{
+ if (!item)
+ return;
+
+ m_noItemOpen = true;
+ emit pathChanged(static_cast<TreeViewItem*>(item)->m_url);
+ m_noItemOpen = false;
+}
+
+void TreeView::slotDoubleClicked(QListViewItem *item)
+{
+ if (!item)
+ return;
+
+ setOpen(item, !item->isOpen());
+}
+
+void TreeView::startDrag()
+{
+ dragObject()->drag();
+}
+
+bool TreeView::acceptDrag(QDropEvent *e)
+{
+ return KURLDrag::canDecode(e) &&
+ ( e->action() == QDropEvent::Copy
+ || e->action() == QDropEvent::Move
+ || e->action() == QDropEvent::Link )
+ && acceptDrops()
+ && dragEnabled();
+}
+
+QDragObject *TreeView::dragObject()
+{
+ TreeViewItem *item = static_cast<TreeViewItem*>(selectedItem());
+
+ // Set the correct pixmap
+ QPixmap pix = *item->pixmap(0);
+
+ KURL::List urls;
+ urls.append(item->m_url);
+
+ KIO::MetaData meta;
+ meta.insert(item->m_url.htmlURL().local8Bit(), "D:0");
+
+ m_dragObject = new KURLDrag(urls, meta, this, name());
+ m_dragObject->setPixmap(pix, QPoint(pix.width() / 2, pix.height() / 2));
+
+ return m_dragObject;
+}
+
+void TreeView::contentsDragEnterEvent(QDragEnterEvent *e)
+{
+ if (!acceptDrag(e)) {
+ e->accept(false);
+ return;
+ }
+
+ e->acceptAction();
+ QListViewItem *i = itemAt(contentsToViewport(e->pos()));
+ if (i)
+ m_dropItem = i;
+}
+
+void TreeView::contentsDragMoveEvent(QDragMoveEvent *e)
+{
+ if (!acceptDrag(e)) {
+ e->accept(false);
+ return;
+ }
+
+ e->acceptAction();
+ QListViewItem *i = itemAt(contentsToViewport(e->pos()));
+
+ if (i && i != m_dropItem)
+ m_dropItem = i;
+}
+
+void TreeView::contentsDragLeaveEvent(QDragLeaveEvent*)
+{
+ m_dropItem = 0L;
+}
+
+void TreeView::contentsDropEvent(QDropEvent *e)
+{
+ if (!m_dropItem)
+ return;
+
+ if (!acceptDrag(e)) {
+ e->acceptAction(false);
+ return;
+ }
+ e->acceptAction();
+
+ // Decode the data and try to init transfer
+ KIO::MetaData meta;
+ KURL::List urls;
+ KURLDrag::decode(e, urls, meta);
+
+ // Move the specified file(s)
+ for (KURL::List::iterator i = urls.begin(); i != urls.end(); ++i) {
+ KURL destUrl = static_cast<TreeViewItem*>(m_dropItem)->m_url;
+
+ if (destUrl != (*i)) {
+ if (destUrl.isLocalFile() != (*i).isLocalFile()) {
+ // TODO Queue up a transfer
+ } else {
+ // Rename/move the file
+ destUrl.addPath((*i).fileName());
+
+ if ((*i).isLocalFile()) {
+ KIO::move((*i), destUrl, false);
+
+ // Reload the listing
+ static_cast<View*>(parent()->parent())->reload();
+ } else {
+ static_cast<View*>(parent()->parent())->m_ftpClient->rename((*i), destUrl);
+ }
+ }
+ }
+ }
+
+ // Invalidate the drop item
+ m_dropItem = 0L;
+}
+
+}
+
+}
+
+#include "treeview.moc"
diff --git a/kftpgrabber/src/widgets/browser/treeview.h b/kftpgrabber/src/widgets/browser/treeview.h
new file mode 100644
index 0000000..220ac88
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/treeview.h
@@ -0,0 +1,189 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPFILEDIRTREEVIEW_H
+#define KFTPFILEDIRTREEVIEW_H
+
+#include <klistview.h>
+#include <klocale.h>
+#include <kurl.h>
+
+#include <qpixmap.h>
+#include <qdict.h>
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class TreeViewItem;
+
+/**
+ * This class represents a tree view showing the directory structure. It
+ * should usually be used together with a ListView.
+ *
+ * @author Jernej Kos
+ */
+class TreeView : public KListView
+{
+Q_OBJECT
+friend class ListView;
+friend class TreeViewItem;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent widget
+ */
+ TreeView(QWidget *parent);
+
+ /**
+ * Class destructor.
+ */
+ ~TreeView();
+
+ /**
+ * Open an URL.
+ *
+ * @param url The url to open
+ */
+ int openUrl(const KURL &url, QListViewItem *parent = 0);
+
+ /**
+ * Remove the folder's child items.
+ *
+ * @param url The folder's URL
+ */
+ void clearFolder(const KURL &url);
+
+ /**
+ * Remove the folder and it's child items.
+ *
+ * @param url The folder's URL
+ */
+ void removeFolder(const KURL &url);
+
+ /**
+ * Create a new folder identified by it's URL and any folders missing
+ * in the hierarchy.
+ *
+ * @param url The folder's URL
+ * @param icon The icon to use
+ */
+ void createFolder(const KURL &url, QPixmap icon);
+
+ /**
+ * Clear all items in the view and create a new root item.
+ *
+ * @param url The root's new URL
+ */
+ void resetView(const KURL &url);
+
+ /**
+ * End item update and clear all non-dirty items.
+ *
+ * @param url The url to purge
+ */
+ void endUpdate(const KURL &url);
+private:
+ QDict<TreeViewItem> m_treeItems;
+ bool m_noItemOpen;
+
+ /* Drag & drop support */
+ QListViewItem *m_dropItem;
+ QDragObject *m_dragObject;
+
+ QDragObject *dragObject();
+ void startDrag();
+ bool acceptDrag(QDropEvent *e);
+ void contentsDragEnterEvent(QDragEnterEvent *e);
+ void contentsDragMoveEvent(QDragMoveEvent *e);
+ void contentsDragLeaveEvent(QDragLeaveEvent*);
+ void contentsDropEvent(QDropEvent *e);
+protected:
+ QListViewItem *findItem(QListViewItem *parent, const QString &name);
+private slots:
+ void slotClicked(QListViewItem *item);
+ void slotDoubleClicked(QListViewItem *item);
+signals:
+ void pathChanged(const KURL &url);
+};
+
+/**
+ * This class represents an item in the tree view.
+ *
+ * @author Jernej Kos
+ */
+class TreeViewItem : public QListViewItem
+{
+friend class TreeView;
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent tree view
+ * @param url This item's URL
+ */
+ TreeViewItem(TreeView *parent, const KURL &url);
+
+ /**
+ * Class constructor.
+ *
+ * @param tree The tree view instance
+ * @param parent The parent list view item
+ * @param url This item's URL
+ */
+ TreeViewItem(TreeView *tree, QListViewItem *parent, const KURL &url);
+
+ /**
+ * Class destructor.
+ */
+ ~TreeViewItem();
+protected:
+ /**
+ * @overload
+ * Reimplemented from QListViewItem to provide proper comparation.
+ */
+ int compare(QListViewItem *i, int col, bool) const;
+private:
+ TreeView *m_tree;
+ KURL m_url;
+ bool m_dirty;
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/browser/view.cpp b/kftpgrabber/src/widgets/browser/view.cpp
new file mode 100644
index 0000000..4b3b0e5
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/view.cpp
@@ -0,0 +1,456 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "browser/view.h"
+#include "browser/detailsview.h"
+#include "browser/treeview.h"
+#include "browser/actions.h"
+#include "browser/filterwidget.h"
+
+#include "kftpbookmarks.h"
+#include "misc/config.h"
+#include "kftpsession.h"
+#include "ftpsocket.h"
+
+#include "misc.h"
+
+#include <klocale.h>
+#include <ktoolbar.h>
+#include <kstatusbar.h>
+#include <kcombobox.h>
+#include <kaction.h>
+#include <kmessagebox.h>
+#include <ksslinfodlg.h>
+#include <klineedit.h>
+#include <kpixmapprovider.h>
+
+#include <kio/job.h>
+
+#include <qdir.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+using namespace KFTPGrabberBase;
+using namespace KFTPEngine;
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class HistoryPixmapProvider : public KPixmapProvider
+{
+public:
+ QPixmap pixmapFor(const QString&, int)
+ {
+ return loadSmallPixmap("folder");
+ }
+};
+
+View::View(QWidget *parent, const char *name, KFTPEngine::Thread *client, KFTPSession::Session *session)
+ : QWidget(parent, name),
+ m_session(session),
+ m_ftpClient(client)
+{
+ m_connTimer = new QTimer(this);
+
+ // Create the GUI
+ init();
+ populateToolbar();
+
+ // Hide/show the tree acoording to configuration
+ setTreeVisible(KFTPCore::Config::showTree());
+
+ // Let us be up to date with bookmark changes
+ connect(KFTPBookmarks::Manager::self(), SIGNAL(update()), this, SLOT(updateBookmarks()));
+
+ // Some other stuff
+ connect(m_ftpClient->eventHandler(), SIGNAL(engineEvent(KFTPEngine::Event*)), this, SLOT(slotEngineEvent(KFTPEngine::Event*)));
+ connect(m_connTimer, SIGNAL(timeout()), this, SLOT(slotDurationUpdate()));
+
+ // Config updates to hide/show the tree
+ connect(KFTPCore::Config::self(), SIGNAL(configChanged()), this, SLOT(slotConfigUpdate()));
+}
+
+View::~View()
+{
+}
+
+void View::init()
+{
+ // Init actions
+ m_actions = new Actions(this);
+ m_actions->initActions();
+
+ // Layout
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ // Create the toolbars
+ m_toolBarFirst = new KToolBar(this, "first toolbar", false, false);
+ m_toolBarSecond = new KToolBar(this, "second toolbar", false, false);
+ m_searchToolBar = new KToolBar(this, "search toolbar", false, false);
+
+ m_toolBarFirst->setEnableContextMenu(false);
+ m_toolBarFirst->setMovingEnabled(false);
+ m_toolBarFirst->setFullSize(true);
+
+ m_toolBarSecond->setEnableContextMenu(false);
+ m_toolBarSecond->setMovingEnabled(false);
+ m_toolBarSecond->setFullSize(true);
+
+ m_searchToolBar->setEnableContextMenu(false);
+ m_searchToolBar->setMovingEnabled(false);
+ m_searchToolBar->setFullSize(true);
+
+ QLabel *filterLabel = new QLabel(i18n("Filter: "), m_searchToolBar);
+ m_searchToolBar->insertWidget(1, 35, filterLabel);
+
+ // Create the erase button
+ m_toolBarSecond->insertButton(QApplication::reverseLayout() ? "clear_left" :"locationbar_erase", 0, SIGNAL(clicked()), this, SLOT(slotHistoryEraseClicked()), true);
+
+ // Create the labels
+ QLabel *pathLabel = new QLabel(i18n("Path: "), m_toolBarSecond);
+ m_toolBarSecond->insertWidget(1, 35, pathLabel);
+
+ // Create the history combo
+ m_historyCombo = new KHistoryCombo(true, m_toolBarSecond);
+ m_toolBarSecond->insertWidget(2, 0, m_historyCombo);
+ m_historyCombo->setPixmapProvider(new HistoryPixmapProvider());
+ m_historyCombo->setMaxCount(25);
+ m_historyCombo->setSizeLimit(25);
+ m_historyCombo->setDuplicatesEnabled(false);
+ m_historyCombo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
+
+ connect(m_historyCombo, SIGNAL(activated(const QString&)), this, SLOT(slotHistoryActivated(const QString&)));
+
+ // Do some more stuff
+ m_toolBarSecond->setItemAutoSized(1, true);
+ m_toolBarSecond->setStretchableWidget(m_historyCombo);
+ m_toolBarSecond->updateRects(true);
+ m_toolBarFirst->updateRects(true);
+
+ // Create a splitter
+ m_splitter = new QSplitter(this);
+ m_splitter->setOpaqueResize(true);
+ m_splitter->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
+
+ // Create a status bar
+ QHBoxLayout *statusLayout = new QHBoxLayout(this);
+
+ m_connDurationMsg = new QLabel(this);
+ m_connDurationMsg->setAlignment(AlignAuto | AlignVCenter | AlignHCenter | ExpandTabs);
+ m_connDurationMsg->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
+ m_connDurationMsg->setMinimumWidth(100);
+
+ m_sslIcon = new QPushButton(this);
+ m_sslIcon->setFlat(true);
+ m_sslIcon->setIconSet(SmallIconSet("decrypted"));
+ m_sslIcon->setEnabled(false);
+
+ connect(m_sslIcon, SIGNAL(clicked()), this, SLOT(slotDisplayCertInfo()));
+
+ m_statusMsg = new QLabel(this);
+ m_statusMsg->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
+ m_statusMsg->setText(i18n("Idle."));
+
+ statusLayout->addWidget(m_statusMsg, 1);
+ statusLayout->addWidget(m_connDurationMsg);
+ statusLayout->addWidget(m_sslIcon);
+
+ // Add toolbars to the layout
+ layout->addWidget(m_toolBarFirst);
+ layout->addWidget(m_toolBarSecond);
+ layout->addWidget(m_splitter, 10);
+ layout->addWidget(m_searchToolBar);
+ layout->addLayout(statusLayout);
+
+ // Now add some stuff to the splitter
+ m_detailsView = new DetailsView(m_splitter, this, m_session);
+ m_splitter->moveToLast(m_detailsView);
+
+ connect(m_detailsView->locationNavigator(), SIGNAL(historyChanged()), this, SLOT(slotHistoryChanged()));
+
+ // Create the tree view
+ m_tree = new TreeView(m_splitter);
+ m_splitter->moveToFirst(m_tree);
+
+ m_detailsView->setTreeView(m_tree);
+ m_detailsView->openUrl(KURL(KFTPCore::Config::defLocalDir()));
+
+ // Create the filter widget
+ m_searchFilter = new FilterWidget(m_searchToolBar, m_detailsView);
+ m_searchToolBar->setItemAutoSized(2, true);
+ m_searchToolBar->setStretchableWidget(m_searchFilter);
+
+ m_searchToolBar->updateRects(true);
+ m_searchToolBar->hide();
+}
+
+const KURL &View::url() const
+{
+ return m_detailsView->url();
+}
+
+const QValueList<LocationNavigator::Element> View::history(int &index) const
+{
+ return m_detailsView->history(index);
+}
+
+const KFileItemList *View::selectedItems() const
+{
+ return m_detailsView->KFileView::selectedItems();
+}
+
+KURL::List View::selectedURLs() const
+{
+ KURL::List urls;
+ const KFileItemList *list = selectedItems();
+
+ if (list) {
+ KFileItemListIterator i(*list);
+ KFileItem *item;
+
+ while ((item = i.current()) != 0) {
+ urls.append(item->url());
+ ++i;
+ }
+ }
+
+ return urls;
+}
+
+const KFileItemList *View::items() const
+{
+ return m_detailsView->KFileView::items();
+}
+
+void View::openUrl(const KURL &url)
+{
+ m_detailsView->openUrl(url);
+}
+
+void View::setShowHidden(bool value)
+{
+ m_detailsView->setShowHidden(value);
+}
+
+void View::setHomeUrl(const KURL &url)
+{
+ m_detailsView->setHomeUrl(url);
+}
+
+void View::goBack()
+{
+ m_detailsView->goBack();
+}
+
+void View::goForward()
+{
+ m_detailsView->goForward();
+}
+
+void View::goUp()
+{
+ m_detailsView->goUp();
+}
+
+void View::goHome()
+{
+ m_detailsView->goHome();
+}
+
+void View::reload()
+{
+ m_detailsView->reload();
+}
+
+void View::rename(const KURL &source, const QString &name)
+{
+ KURL dest(source.upURL());
+ dest.addPath(name);
+
+ if (source.isLocalFile())
+ KIO::rename(source, dest, false);
+ else
+ m_session->getClient()->rename(source, dest);
+}
+
+void View::slotConfigUpdate()
+{
+ setTreeVisible(KFTPCore::Config::showTree());
+}
+
+void View::setTreeVisible(bool visible)
+{
+ if (visible)
+ m_tree->show();
+ else
+ m_tree->hide();
+
+ m_actions->m_toggleTreeViewAction->setChecked(visible);
+}
+
+void View::populateToolbar()
+{
+ // Add the actions to the toolbar
+ m_actions->m_siteChangeAction->plug(m_toolBarFirst);
+
+ m_toolBarFirst->insertSeparator();
+
+ m_actions->m_goUpAction->plug(m_toolBarFirst);
+ m_actions->m_goBackAction->plug(m_toolBarFirst);
+ m_actions->m_goForwardAction->plug(m_toolBarFirst);
+ m_actions->m_reloadAction->plug(m_toolBarFirst);
+
+ m_toolBarFirst->insertSeparator();
+
+ m_actions->m_goHomeAction->plug(m_toolBarFirst);
+ m_actions->m_createDirAction->plug(m_toolBarFirst);
+
+ m_toolBarFirst->insertSeparator();
+
+ m_actions->m_abortAction->plug(m_toolBarFirst);
+ m_actions->m_toggleTreeViewAction->plug(m_toolBarFirst);
+ m_actions->m_toggleFilterAction->plug(m_toolBarFirst);
+
+ m_toolBarFirst->insertSeparator();
+
+ m_actions->m_moreActions->plug(m_toolBarFirst);
+}
+
+void View::updateActions()
+{
+ // Force action update
+ m_actions->updateActions();
+}
+
+void View::updateBookmarks()
+{
+ // Repopulate bookmarks menu on updates
+ m_actions->m_connectAction->popupMenu()->clear();
+ KFTPBookmarks::Manager::self()->guiPopulateBookmarksMenu(m_actions->m_connectAction, QDomNode(), false, m_session);
+}
+
+void View::slotHistoryActivated(const QString &text)
+{
+ KURL dest = url();
+ dest.setPath(text);
+
+ openUrl(dest);
+}
+
+void View::slotHistoryEraseClicked()
+{
+ m_historyCombo->setCurrentText(QString::null);
+ m_historyCombo->setFocus();
+}
+
+void View::slotHistoryChanged()
+{
+ /*m_historyCombo->insertItem(loadSmallPixmap("folder"), url().path(-1), 0);
+ m_historyCombo->setCurrentItem(0);*/
+ m_historyCombo->addToHistory(url().path(-1));
+}
+
+void View::slotDisplayCertInfo()
+{
+ if (m_ftpClient->socket()->protocolName() == "ftp" && m_ftpClient->socket()->isEncrypted()) {
+ KSSLInfoDlg *sslInfo = new KSSLInfoDlg(true, this);
+ sslInfo->exec();
+ } else if (m_ftpClient->socket()->protocolName() == "sftp") {
+ KMessageBox::information(this, i18n("This is a SSH encrypted connection. No certificate info is currently available."));
+ } else {
+ KSSLInfoDlg *sslInfo = new KSSLInfoDlg(false, this);
+ sslInfo->exec();
+ }
+}
+
+void View::slotDurationUpdate()
+{
+ m_connDuration = m_connDuration.addSecs(1);
+ m_connDurationMsg->setText(m_connDuration.toString("hh:mm:ss"));
+}
+
+void View::slotEngineEvent(KFTPEngine::Event *event)
+{
+ switch (event->type()) {
+ case Event::EventState: {
+ // Set new state
+ m_statusMsg->setText(event->getParameter(0).asString());
+ break;
+ }
+ case Event::EventConnect:
+ case Event::EventDisconnect: {
+ // Change encryption icon
+ m_sslIcon->setIconSet(SmallIconSet(m_ftpClient->socket()->isEncrypted() ? "encrypted" : "decrypted"));
+ m_sslIcon->setEnabled(m_ftpClient->socket()->isConnected());
+
+ // Start or stop the duration timer
+ if (m_ftpClient->socket()->isConnected()) {
+ m_connTimer->start(1000);
+ m_connDuration.setHMS(0, 0, 0);
+ } else {
+ m_connTimer->stop();
+ m_connDurationMsg->setText("");
+ }
+
+ // Reset selected charset to default
+ KPopupMenu *menu = m_actions->m_changeEncodingAction->popupMenu();
+ menu->setItemChecked(m_actions->m_defaultCharsetOption, true);
+ menu->setItemChecked(m_actions->m_curCharsetOption, false);
+ m_actions->m_curCharsetOption = m_actions->m_defaultCharsetOption;
+ break;
+ }
+ default: break;
+ }
+
+ if (m_ftpClient->socket()->isBusy()) {
+ m_tree->setEnabled(false);
+ m_detailsView->setEnabled(false);
+ m_toolBarSecond->setEnabled(false);
+ } else if (KFTPQueue::Manager::self()->getNumRunning(m_ftpClient->socket()->getCurrentUrl()) == 0) {
+ m_tree->setEnabled(true);
+ m_detailsView->setEnabled(true);
+ m_toolBarSecond->setEnabled(true);
+ }
+
+ // Update actions
+ updateActions();
+}
+
+}
+
+}
+
+#include "view.moc"
diff --git a/kftpgrabber/src/widgets/browser/view.h b/kftpgrabber/src/widgets/browser/view.h
new file mode 100644
index 0000000..67dffa6
--- /dev/null
+++ b/kftpgrabber/src/widgets/browser/view.h
@@ -0,0 +1,258 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPFILEDIRVIEW_H
+#define KFTPFILEDIRVIEW_H
+
+#include "browser/locationnavigator.h"
+
+#include <qwidget.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qdatetime.h>
+#include <qsplitter.h>
+
+#include <kurl.h>
+#include <kfileitem.h>
+
+namespace KFTPSession {
+ class Session;
+ class Manager;
+}
+
+class KToolBar;
+class KHistoryCombo;
+class KAction;
+class KLineEdit;
+
+namespace KFTPEngine {
+ class Thread;
+ class Event;
+}
+
+namespace KFTPWidgets {
+
+namespace Browser {
+
+class DetailsView;
+class ListView;
+class TreeView;
+class Actions;
+class FilterWidget;
+
+/**
+ * @author Jernej Kos
+ */
+class View : public QWidget
+{
+Q_OBJECT
+friend class Actions;
+friend class DetailsView;
+friend class ListView;
+friend class TreeView;
+friend class KFTPSession::Manager;
+friend class KFTPSession::Session;
+public:
+ /**
+ * Class constructor.
+ */
+ View(QWidget *parent, const char *name, KFTPEngine::Thread *client, KFTPSession::Session *session);
+
+ /**
+ * Class destructor.
+ */
+ ~View();
+
+ /**
+ * Returns the current URL.
+ */
+ const KURL &url() const;
+
+ /**
+ * Returns the current history elements.
+ *
+ * @param index Variable to save the current history position to
+ * @return Current history element list
+ */
+ const QValueList<LocationNavigator::Element> history(int &index) const;
+
+ /**
+ * Returns all currenty selected items.
+ */
+ const KFileItemList *selectedItems() const;
+
+ /**
+ * Returns all currently selected URLs.
+ */
+ KURL::List selectedURLs() const;
+
+ /**
+ * Returns all items in the current sort order.
+ */
+ const KFileItemList *items() const;
+
+ /**
+ * Open an URL. Note that if a remote URL is specified the session needs to
+ * be connected to the specified host!
+ *
+ * @param url URL to open
+ */
+ void openUrl(const KURL &url);
+
+ /**
+ * Changes the visibility of tree widget.
+ *
+ * @param visible True to display the tree widget, false to hide it
+ */
+ void setTreeVisible(bool visible);
+
+ /**
+ * Changes the "show hidden files" setting.
+ *
+ * @param value True to enable showing hidden files, false otherwise
+ */
+ void setShowHidden(bool value);
+
+ /**
+ * Set the home URL.
+ *
+ * @param url URL to use as home URL
+ */
+ void setHomeUrl(const KURL &url);
+
+ /**
+ * Go one history hop back.
+ */
+ void goBack();
+
+ /**
+ * Go one history hop forward.
+ */
+ void goForward();
+
+ /**
+ * Go up in the directory structure.
+ */
+ void goUp();
+
+ /**
+ * Go the the predefined home URL.
+ */
+ void goHome();
+
+ /**
+ * Reload the current directory listing.
+ */
+ void reload();
+
+ /**
+ * Renames the provided source file to a new name.
+ */
+ void rename(const KURL &source, const QString &name);
+
+ /**
+ * Returns the details view widget.
+ */
+ DetailsView *getDetailsView() const { return m_detailsView; }
+
+ /**
+ * Returns the tree view widget.
+ */
+ TreeView *getTreeView() const { return m_tree; }
+
+ /**
+ * Returns the status label widget.
+ */
+ QLabel *getStatusLabel() const { return m_statusMsg; }
+
+ /**
+ * Returns the associated session.
+ */
+ KFTPSession::Session *getSession() const { return m_session; }
+protected:
+ /**
+ * Initialize the widget.
+ */
+ void init();
+
+ /**
+ * Populate the toolbar.
+ */
+ void populateToolbar();
+private:
+ KFTPSession::Session *m_session;
+ KFTPEngine::Thread *m_ftpClient;
+
+ DetailsView *m_detailsView;
+ TreeView *m_tree;
+
+ Actions *m_actions;
+
+ KToolBar *m_toolBarFirst; /* Upper toolbar */
+ KToolBar *m_toolBarSecond; /* Lower toolbar */
+ KToolBar *m_searchToolBar;
+
+ QLabel *m_statusMsg;
+ QLabel *m_connDurationMsg;
+ QPushButton *m_sslIcon;
+ QSplitter *m_splitter;
+
+ QTimer *m_connTimer;
+ QTime m_connDuration;
+
+ KHistoryCombo *m_historyCombo;
+ FilterWidget *m_searchFilter;
+public slots:
+ void updateActions();
+ void updateBookmarks();
+private slots:
+ void slotHistoryEraseClicked();
+ void slotHistoryActivated(const QString &text);
+ void slotHistoryChanged();
+
+ void slotDisplayCertInfo();
+ void slotDurationUpdate();
+
+ void slotEngineEvent(KFTPEngine::Event *event);
+
+ void slotConfigUpdate();
+};
+
+}
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/configdialog.cpp b/kftpgrabber/src/widgets/configdialog.cpp
new file mode 100644
index 0000000..49d0d16
--- /dev/null
+++ b/kftpgrabber/src/widgets/configdialog.cpp
@@ -0,0 +1,187 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "configdialog.h"
+#include "misc.h"
+#include "misc/config.h"
+#include "widgets/systemtray.h"
+
+#include <klocale.h>
+#include <kfontdialog.h>
+#include <kcolorbutton.h>
+#include <kurlrequester.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kglobal.h>
+#include <kcharsets.h>
+#include <kcombobox.h>
+
+#include <qframe.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+
+// Config layouts
+#include "ui/config_general.h"
+#include "ui/config_transfers.h"
+#include "ui/config_log.h"
+#include "ui/config_display.h"
+
+#include "configfilter.h"
+
+namespace KFTPWidgets {
+
+ConfigDialog::ConfigDialog(QWidget *parent, const char *name)
+ : KConfigDialog(parent, name, KFTPCore::Config::self(), KDialogBase::TreeList, Ok|Apply|Cancel, Ok, true)
+{
+ // Add all standard pages
+ addPage(new GeneralSettings(0, "General"), i18n("General"), "kfm");
+ addPage(new TransferSettings(0, "Transfers"), i18n("Transfers"), "queue");
+ addPage(new LogSettings(0, "Log"), i18n("Log"), "log");
+ addPage(new DisplaySettings(0, "Display"), i18n("Display"), "display");
+
+ // Add the actions page
+ QFrame *aFrame = new QFrame();
+ QVBoxLayout *aLayout = new QVBoxLayout(aFrame, 0, 0);
+ aLayout->addWidget(KFTPCore::Config::self()->dActions()->getConfigWidget(aFrame));
+ aLayout->addSpacing(KDialog::spacingHint());
+ aLayout->addWidget(KFTPCore::Config::self()->uActions()->getConfigWidget(aFrame));
+ aLayout->addSpacing(KDialog::spacingHint());
+ aLayout->addWidget(KFTPCore::Config::self()->fActions()->getConfigWidget(aFrame));
+ aLayout->addStretch(1);
+ addPage(aFrame, i18n("Actions"), "kfm");
+
+ // Add the filter page
+ aFrame = new QFrame();
+ aLayout = new QVBoxLayout(aFrame, 0, 0);
+ m_configFilter = new ConfigFilter(aFrame);
+ aLayout->addWidget(m_configFilter);
+ addPage(aFrame, i18n("Filters"), "kfm");
+
+ // Setup some stuff
+ static_cast<KURLRequester*>(child("kcfg_defLocalDir"))->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
+
+ // Setup signals
+ connect(child("kcfg_globalMail"), SIGNAL(toggled(bool)), this, SLOT(slotGeneralEmailChanged(bool)));
+ connect(child("kcfg_portForceIp"), SIGNAL(toggled(bool)), this, SLOT(slotTransfersForceIpChanged(bool)));
+ connect(child("kcfg_activeForcePort"), SIGNAL(toggled(bool)), this, SLOT(slotTransfersForcePortChanged(bool)));
+ connect(child("kcfg_diskCheckSpace"), SIGNAL(toggled(bool)), this, SLOT(slotTransfersDiskChanged(bool)));
+ connect(child("kcfg_failedAutoRetry"), SIGNAL(toggled(bool)), this, SLOT(slotTransfersFailedRetryChanged(bool)));
+ connect(child("kcfg_saveToFile"), SIGNAL(toggled(bool)), this, SLOT(slotLogOutputFileChanged(bool)));
+
+ // Refresh states
+ slotGeneralEmailChanged(static_cast<QCheckBox*>(child("kcfg_globalMail"))->isChecked());
+ slotTransfersForceIpChanged(static_cast<QCheckBox*>(child("kcfg_portForceIp"))->isChecked());
+ slotTransfersDiskChanged(static_cast<QCheckBox*>(child("kcfg_diskCheckSpace"))->isChecked());
+ slotTransfersFailedRetryChanged(static_cast<QCheckBox*>(child("kcfg_failedAutoRetry"))->isChecked());
+ slotLogOutputFileChanged(static_cast<QCheckBox*>(child("kcfg_saveToFile"))->isChecked());
+ slotTransfersForcePortChanged(static_cast<QCheckBox*>(child("kcfg_activeForcePort"))->isChecked());
+
+ // Let the config be up-to-date
+ connect(this, SIGNAL(settingsChanged()), KFTPCore::Config::self(), SLOT(emitChange()));
+ connect(this, SIGNAL(okClicked()), this, SLOT(slotSettingsChanged()));
+}
+
+void ConfigDialog::prepareDialog()
+{
+ // Update the actions
+ KFTPCore::Config::self()->dActions()->updateWidget();
+ KFTPCore::Config::self()->uActions()->updateWidget();
+ KFTPCore::Config::self()->fActions()->updateWidget();
+
+ // Populate charsets
+ QStringList charsets = KGlobal::charsets()->descriptiveEncodingNames();
+ static_cast<KComboBox*>(child("cfg_defEncoding"))->insertStringList(charsets);
+
+ QString defEncoding = KFTPCore::Config::defEncoding();
+ defEncoding = QString("%1 ( %2 )").arg(KGlobal::charsets()->languageForEncoding(defEncoding)).arg(defEncoding);
+ static_cast<KComboBox*>(child("cfg_defEncoding"))->setCurrentText(defEncoding);
+
+ m_configFilter->loadSettings();
+}
+
+void ConfigDialog::slotSettingsChanged()
+{
+ // Update the actions
+ KFTPCore::Config::self()->dActions()->updateConfig();
+ KFTPCore::Config::self()->uActions()->updateConfig();
+ KFTPCore::Config::self()->fActions()->updateConfig();
+
+ m_configFilter->saveSettings();
+
+ // Save encoding
+ KFTPCore::Config::setDefEncoding(KGlobal::charsets()->encodingForName(static_cast<KComboBox*>(child("cfg_defEncoding"))->currentText()));
+
+ // Show/hide the systray icon
+ if (KFTPCore::Config::showSystrayIcon())
+ SystemTray::self()->show();
+ else
+ SystemTray::self()->hide();
+}
+
+void ConfigDialog::slotGeneralEmailChanged(bool on)
+{
+ static_cast<QWidget*>(child("kcfg_anonMail"))->setEnabled(!on);
+}
+
+void ConfigDialog::slotTransfersForceIpChanged(bool on)
+{
+ static_cast<QWidget*>(child("kcfg_portIp"))->setEnabled(on);
+}
+
+void ConfigDialog::slotTransfersForcePortChanged(bool on)
+{
+ static_cast<QWidget*>(child("kcfg_activeMinPort"))->setEnabled(on);
+ static_cast<QWidget*>(child("kcfg_activeMaxPort"))->setEnabled(on);
+}
+
+void ConfigDialog::slotTransfersDiskChanged(bool on)
+{
+ static_cast<QWidget*>(child("kcfg_diskCheckInterval"))->setEnabled(on);
+ static_cast<QWidget*>(child("kcfg_diskMinFreeSpace"))->setEnabled(on);
+}
+
+void ConfigDialog::slotTransfersFailedRetryChanged(bool on)
+{
+ static_cast<QWidget*>(child("kcfg_failedAutoRetryCount"))->setEnabled(on);
+}
+
+void ConfigDialog::slotLogOutputFileChanged(bool on)
+{
+ static_cast<QWidget*>(child("kcfg_outputFilename"))->setEnabled(on);
+}
+
+}
+
+#include "configdialog.moc"
diff --git a/kftpgrabber/src/widgets/configdialog.h b/kftpgrabber/src/widgets/configdialog.h
new file mode 100644
index 0000000..6234c14
--- /dev/null
+++ b/kftpgrabber/src/widgets/configdialog.h
@@ -0,0 +1,71 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPCONFIGDIALOG_H
+#define KFTPCONFIGDIALOG_H
+
+#include <kconfigdialog.h>
+
+namespace KFTPWidgets {
+
+class ConfigFilter;
+
+/**
+ * @author Jernej Kos
+ */
+class ConfigDialog : public KConfigDialog
+{
+Q_OBJECT
+public:
+ ConfigDialog(QWidget *parent, const char *name = 0);
+
+ void prepareDialog();
+private:
+ ConfigFilter *m_configFilter;
+private slots:
+ void slotGeneralEmailChanged(bool on);
+
+ void slotTransfersForceIpChanged(bool on);
+ void slotTransfersDiskChanged(bool on);
+ void slotTransfersForcePortChanged(bool on);
+ void slotTransfersFailedRetryChanged(bool on);
+
+ void slotLogOutputFileChanged(bool on);
+
+ void slotSettingsChanged();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/configfilter.cpp b/kftpgrabber/src/widgets/configfilter.cpp
new file mode 100644
index 0000000..c2dc3b9
--- /dev/null
+++ b/kftpgrabber/src/widgets/configfilter.cpp
@@ -0,0 +1,137 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "configfilter.h"
+#include "filtereditor.h"
+
+#include "misc/config.h"
+#include "misc.h"
+
+#include <klistview.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <kmessagebox.h>
+#include <klineeditdlg.h>
+
+#include <klineedit.h>
+#include <kcolorbutton.h>
+#include <kdialogbase.h>
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+ConfigFilter::ConfigFilter(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ // Create the main widget
+ QVBoxLayout *t = new QVBoxLayout(this, 0, 0);
+
+ m_editorLayout = new ConfigFilterLayout(this);
+ t->addWidget(m_editorLayout);
+
+ m_filterEditor = new FilterEditor(this);
+ m_editorLayout->tabWidget->insertTab(m_filterEditor, i18n("Filters"), 0);
+ m_editorLayout->tabWidget->setCurrentPage(0);
+ m_editorLayout->tabWidget->setMargin(KDialog::spacingHint());
+
+ loadSettings();
+
+ // Connect the slots
+ connect(m_editorLayout->addExtButton, SIGNAL(clicked()), this, SLOT(slotAddAscii()));
+ connect(m_editorLayout->removeExtButton, SIGNAL(clicked()), this, SLOT(slotRemoveAscii()));
+}
+
+void ConfigFilter::loadSettings()
+{
+ m_filterEditor->reset();
+ asciiLoadExtensions();
+}
+
+void ConfigFilter::saveSettings()
+{
+ // Save the settings
+ KFTPCore::Config::setAsciiList(asciiToStringList());
+}
+
+void ConfigFilter::slotAddAscii()
+{
+ if (!m_editorLayout->newExtension->text().stripWhiteSpace().isEmpty()) {
+ new QListViewItem(m_editorLayout->extensionList, m_editorLayout->newExtension->text().stripWhiteSpace());
+ m_editorLayout->newExtension->clear();
+ }
+}
+
+void ConfigFilter::slotRemoveAscii()
+{
+ if (!m_editorLayout->extensionList->selectedItem())
+ return;
+
+ delete m_editorLayout->extensionList->selectedItem();
+}
+
+void ConfigFilter::asciiLoadExtensions()
+{
+ // Load the ascii extensions
+ m_editorLayout->extensionList->clear();
+ QStringList p_extensions = KFTPCore::Config::asciiList();
+
+ QStringList::iterator end( p_extensions.end() );
+ for (QStringList::iterator i( p_extensions.begin() ); i != end; ++i) {
+ new QListViewItem(m_editorLayout->extensionList, (*i));
+ }
+
+}
+
+QStringList ConfigFilter::asciiToStringList()
+{
+ QStringList p_extensions;
+ QListViewItem *i = m_editorLayout->extensionList->firstChild();
+ while (i) {
+ p_extensions.append(i->text(0));
+
+ i = i->itemBelow();
+ }
+
+ return p_extensions;
+}
+
+}
+#include "configfilter.moc"
diff --git a/kftpgrabber/src/widgets/configfilter.h b/kftpgrabber/src/widgets/configfilter.h
new file mode 100644
index 0000000..3d9ee22
--- /dev/null
+++ b/kftpgrabber/src/widgets/configfilter.h
@@ -0,0 +1,79 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSCONFIGFILTER_H
+#define KFTPWIDGETSCONFIGFILTER_H
+
+#include <qwidget.h>
+#include <kdialogbase.h>
+#include <knuminput.h>
+#include <qradiobutton.h>
+#include <qvaluelist.h>
+
+// Layouts
+#include "ui/config_filters.h"
+
+namespace KFTPWidgets {
+
+class FilterEditor;
+
+/**
+ * Filter related configuration dialog.
+ *
+ * @author Jernej Kos
+ */
+class ConfigFilter : public QWidget
+{
+Q_OBJECT
+public:
+ ConfigFilter(QWidget *parent = 0, const char *name = 0);
+
+ void saveSettings();
+ void loadSettings();
+private:
+ void asciiLoadExtensions();
+ QStringList asciiToStringList();
+
+ FilterEditor *m_filterEditor;
+ ConfigFilterLayout *m_editorLayout;
+private slots:
+ void slotAddAscii();
+ void slotRemoveAscii();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/failedtransfers.cpp b/kftpgrabber/src/widgets/failedtransfers.cpp
new file mode 100644
index 0000000..30fc0a6
--- /dev/null
+++ b/kftpgrabber/src/widgets/failedtransfers.cpp
@@ -0,0 +1,213 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "failedtransfers.h"
+#include "kftpqueue.h"
+#include "listview.h"
+#include "misc.h"
+#include "kftpapi.h"
+
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kio/job.h>
+#include <kmessagebox.h>
+
+#include <qlayout.h>
+#include <qheader.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+FailedTransferItem::FailedTransferItem(KFTPQueue::FailedTransfer *transfer, QListView *parent)
+ : KFTPWidgets::ListViewItem(parent),
+ m_failedTransfer(transfer)
+{
+ QString desc = "<nobr><b>";
+ desc += i18n("Transfer");
+ desc += ":</b> ";
+ desc += transfer->getTransfer()->getSourceUrl().prettyURL();
+ desc += " <b>&gt;&gt;&gt;</b> ";
+ desc += transfer->getTransfer()->getDestUrl().prettyURL();
+ desc += "<br><b>";
+ desc += i18n("Error");
+ desc += ":</b> <i>";
+ desc += transfer->getError();
+ desc += "</i></nobr>";
+
+ // Setup columns
+ setRichText(0, desc);
+ setText(1, KIO::convertSize(transfer->getTransfer()->getActualSize()));
+ setText(2, QString::number(transfer->getTransfer()->getId()));
+
+ setPixmap(0, loadSmallPixmap("info"));
+}
+
+KActionCollection *FailedTransfers::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+FailedTransfers::FailedTransfers(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ // Create the list view
+ m_list = new KFTPWidgets::ListView(this);
+
+ // Create the columns
+ m_list->addColumn(i18n("Description"), 500);
+ m_list->addColumn(i18n("Size"), 75);
+ m_list->header()->setStretchEnabled(true, 0);
+
+ // Text when there are no failed transfers
+ m_list->setEmptyListText(i18n("There are no failed transfers."));
+ m_list->setAllColumnsShowFocus(true);
+
+ layout->addWidget(m_list);
+
+ connect(KFTPQueue::Manager::self(), SIGNAL(failedTransferNew(KFTPQueue::FailedTransfer*)), this, SLOT(slotFailedTransferNew(KFTPQueue::FailedTransfer*)));
+ connect(KFTPQueue::Manager::self(), SIGNAL(failedTransferRemoved(long)), this, SLOT(slotFailedTransferRemoved(long)));
+
+ connect(m_list, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), this, SLOT(contextMenuRequested(KListView*, QListViewItem*, const QPoint&)));
+
+ // Initialize the actions
+ initActions();
+}
+
+FailedTransfers::~FailedTransfers()
+{
+}
+
+void FailedTransfers::initActions()
+{
+ m_restartAction = new KAction(i18n("&Restart Transfer"), "launch", KShortcut(), this, SLOT(slotRestart()), actionCollection(), "launch");
+ m_addToQueueAction = new KAction(i18n("&Add To Queue"), "queue", KShortcut(), this, SLOT(slotAddToQueue()), actionCollection(), "addtoqueue");
+ m_addAllToQueueAction = new KAction(i18n("Add All To Queue"), KShortcut(), this, SLOT(slotAddAllToQueue()), actionCollection(), "addalltoqueue");
+ m_removeAction = new KAction(i18n("R&emove"), "editdelete", KShortcut(), this, SLOT(slotRemove()), actionCollection(), "remove");
+ m_removeAllAction = new KAction(i18n("Remove All"), KShortcut(), this, SLOT(slotRemoveAll()), actionCollection(), "removeall");
+}
+
+void FailedTransfers::updateActions()
+{
+ m_restartAction->setEnabled(m_list->selectedItem());
+ m_addToQueueAction->setEnabled(m_list->selectedItem());
+ m_removeAction->setEnabled(m_list->selectedItem());
+
+ m_addAllToQueueAction->setEnabled(m_list->childCount());
+ m_removeAllAction->setEnabled(m_list->childCount());
+}
+
+void FailedTransfers::slotFailedTransferNew(KFTPQueue::FailedTransfer *transfer)
+{
+ // Create a new failed transfer list item
+ new FailedTransferItem(transfer, m_list);
+}
+
+void FailedTransfers::slotFailedTransferRemoved(long id)
+{
+ // Delete the failed transfer item
+ QListViewItem *item = m_list->findItem(QString::number(id), 2);
+
+ if (item)
+ delete item;
+}
+
+void FailedTransfers::slotRestart()
+{
+ // First restore the transfer
+ KFTPQueue::TransferFile *transfer = static_cast<FailedTransferItem*>(m_list->selectedItem())->getFailedTransfer()->restore();
+
+ // Then execute it
+ transfer->delayedExecute();
+}
+
+void FailedTransfers::slotAddToQueue()
+{
+ // Restore the transfer
+ static_cast<FailedTransferItem*>(m_list->selectedItem())->getFailedTransfer()->restore();
+}
+
+void FailedTransfers::slotAddAllToQueue()
+{
+ KFTPQueue::FailedTransfer *transfer;
+ QPtrList<KFTPQueue::FailedTransfer> *list = KFTPQueue::Manager::self()->getFailedTransferList();
+ QPtrListIterator<KFTPQueue::FailedTransfer> i(*list);
+
+ while ((transfer = i.current()) != 0) {
+ ++i;
+
+ // Restore the transfer
+ transfer->restore();
+ }
+}
+
+void FailedTransfers::slotRemove()
+{
+ if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove this failed transfer?")) == KMessageBox::Yes) {
+ // Remove the failed transfer
+ KFTPQueue::Manager::self()->removeFailedTransfer(static_cast<FailedTransferItem*>(m_list->selectedItem())->getFailedTransfer());
+ }
+}
+
+void FailedTransfers::slotRemoveAll()
+{
+ if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove ALL failed transfers?")) == KMessageBox::Yes) {
+ KFTPQueue::Manager::self()->clearFailedTransferList();
+ }
+}
+
+void FailedTransfers::contextMenuRequested(KListView*, QListViewItem*, const QPoint &p)
+{
+ KPopupMenu *contextMenu = new KPopupMenu(m_list);
+
+ m_restartAction->plug(contextMenu);
+ m_addToQueueAction->plug(contextMenu);
+ m_addAllToQueueAction->plug(contextMenu);
+ contextMenu->insertSeparator();
+ m_removeAction->plug(contextMenu);
+ m_removeAllAction->plug(contextMenu);
+
+ // Update the actions
+ updateActions();
+
+ contextMenu->exec(p);
+}
+
+}
+
+#include "failedtransfers.moc"
+
diff --git a/kftpgrabber/src/widgets/failedtransfers.h b/kftpgrabber/src/widgets/failedtransfers.h
new file mode 100644
index 0000000..2b17a5a
--- /dev/null
+++ b/kftpgrabber/src/widgets/failedtransfers.h
@@ -0,0 +1,111 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSFAILEDTRANSFERS_H
+#define KFTPWIDGETSFAILEDTRANSFERS_H
+
+#include <klistview.h>
+#include <kaction.h>
+
+#include <qwidget.h>
+#include <qguardedptr.h>
+
+#include "listviewitem.h"
+
+namespace KFTPQueue {
+ class FailedTransfer;
+}
+
+namespace KFTPWidgets {
+
+class ListView;
+
+/**
+ * This class represents a QListViewItem item that contains information
+ * about a specific failed transfer.
+ *
+ * @author Jernej Kos
+ */
+class FailedTransferItem : public KFTPWidgets::ListViewItem
+{
+public:
+ FailedTransferItem(KFTPQueue::FailedTransfer *transfer, QListView *parent);
+
+ KFTPQueue::FailedTransfer *getFailedTransfer() { return m_failedTransfer; }
+private:
+ QGuardedPtr<KFTPQueue::FailedTransfer> m_failedTransfer;
+};
+
+/**
+ * This class provides a list of failed transfers. The transfers
+ * can be restarted.
+ *
+ * @author Jernej Kos
+ */
+class FailedTransfers : public QWidget
+{
+Q_OBJECT
+public:
+ FailedTransfers(QWidget *parent = 0, const char *name = 0);
+ ~FailedTransfers();
+
+ void updateActions();
+ void initActions();
+private:
+ KActionCollection *actionCollection();
+
+ KFTPWidgets::ListView *m_list;
+
+ KAction *m_restartAction;
+ KAction *m_addToQueueAction;
+ KAction *m_addAllToQueueAction;
+ KAction *m_removeAction;
+ KAction *m_removeAllAction;
+private slots:
+ void slotRestart();
+ void slotAddToQueue();
+ void slotAddAllToQueue();
+ void slotRemove();
+ void slotRemoveAll();
+
+ void contextMenuRequested(KListView*, QListViewItem*, const QPoint&);
+
+ void slotFailedTransferNew(KFTPQueue::FailedTransfer*);
+ void slotFailedTransferRemoved(long);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/filtereditor.cpp b/kftpgrabber/src/widgets/filtereditor.cpp
new file mode 100644
index 0000000..9be3b6e
--- /dev/null
+++ b/kftpgrabber/src/widgets/filtereditor.cpp
@@ -0,0 +1,625 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "filtereditor.h"
+#include "listview.h"
+#include "misc/filterwidgethandler.h"
+
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qtooltip.h>
+#include <qheader.h>
+#include <qbuttongroup.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kdialog.h>
+#include <kinputdialog.h>
+
+using namespace KFTPCore::Filter;
+
+namespace KFTPWidgets {
+
+FilterEditor::FilterEditor(QWidget *parent)
+ : QWidget(parent),
+ m_rule(0)
+{
+ QHBoxLayout *mainLayout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ m_listView = new FilterListView(this);
+ mainLayout->addWidget(m_listView, 1);
+
+ QVBoxLayout *rightLayout = new QVBoxLayout(mainLayout);
+ mainLayout->setStretchFactor(rightLayout, KDialog::spacingHint());
+
+ m_enabledCheck = new QCheckBox(i18n("Filter &enabled"), this);
+ rightLayout->addWidget(m_enabledCheck);
+
+ m_conditionsList = new FilterConditionsList(this);
+ rightLayout->addWidget(m_conditionsList, 0, Qt::AlignTop);
+
+ m_actionsList = new FilterActionsList(this);
+ rightLayout->addWidget(m_actionsList, 0, Qt::AlignTop);
+
+ rightLayout->addStretch(1);
+
+ // Connect some signals
+ connect(m_enabledCheck, SIGNAL(clicked()), this, SLOT(slotEnabledChanged()));
+
+ connect(m_listView, SIGNAL(ruleChanged(KFTPCore::Filter::Rule*)), this, SLOT(slotRuleChanged(KFTPCore::Filter::Rule*)));
+ connect(m_listView, SIGNAL(ruleRemoved()), this, SLOT(slotRuleRemoved()));
+
+ connect(m_listView, SIGNAL(ruleChanged(KFTPCore::Filter::Rule*)), m_conditionsList, SLOT(loadRule(KFTPCore::Filter::Rule*)));
+ connect(m_listView, SIGNAL(ruleRemoved()), m_conditionsList, SLOT(reset()));
+
+ connect(m_listView, SIGNAL(ruleChanged(KFTPCore::Filter::Rule*)), m_actionsList, SLOT(loadRule(KFTPCore::Filter::Rule*)));
+ connect(m_listView, SIGNAL(ruleRemoved()), m_actionsList, SLOT(reset()));
+}
+
+void FilterEditor::slotRuleChanged(KFTPCore::Filter::Rule *rule)
+{
+ m_enabledCheck->setEnabled(true);
+ m_enabledCheck->setChecked(rule->isEnabled());
+
+ m_rule = rule;
+}
+
+void FilterEditor::slotRuleRemoved()
+{
+ m_enabledCheck->setChecked(false);
+ m_enabledCheck->setEnabled(false);
+}
+
+void FilterEditor::slotEnabledChanged()
+{
+ if (m_rule)
+ m_rule->setEnabled(m_enabledCheck->isChecked());
+}
+
+void FilterEditor::reset()
+{
+ m_enabledCheck->setChecked(false);
+ m_enabledCheck->setEnabled(false);
+
+ m_conditionsList->reset();
+ m_actionsList->reset();
+ m_listView->reset();
+}
+
+FilterListItem::FilterListItem(ListView *parent, KFTPCore::Filter::Rule *rule)
+ : QListViewItem(parent),
+ m_rule(rule)
+{
+ setText(0, rule->name());
+}
+
+FilterListView::FilterListView(QWidget *parent)
+ : QGroupBox(1, Horizontal, i18n("Filters"), parent)
+{
+ m_listView = new ListView(this);
+ m_listView->setSelectionMode(QListView::Single);
+ m_listView->setSorting(-1);
+ m_listView->header()->hide();
+ m_listView->setMinimumWidth(150);
+ m_listView->setEmptyListText(i18n("No filters."));
+ m_listView->addColumn("");
+ m_listView->setFullWidth(true);
+
+ QHBox *hb = new QHBox(this);
+ hb->setSpacing(4);
+
+ // Up/down buttons
+ m_buttonUp = new KPushButton(QString::null, hb);
+ m_buttonUp->setAutoRepeat(true);
+ m_buttonUp->setIconSet(BarIconSet("up", KIcon::SizeSmall));
+ m_buttonUp->setMinimumSize(m_buttonUp->sizeHint() * 1.2);
+
+ m_buttonDown = new KPushButton(QString::null, hb);
+ m_buttonDown->setAutoRepeat(true);
+ m_buttonDown->setIconSet(BarIconSet("down", KIcon::SizeSmall));
+ m_buttonDown->setMinimumSize(m_buttonDown->sizeHint() * 1.2);
+
+ QToolTip::add(m_buttonUp, i18n("Up"));
+ QToolTip::add(m_buttonDown, i18n("Down"));
+
+ // New, copy, delete buttons
+ hb = new QHBox(this);
+ hb->setSpacing(4);
+
+ m_buttonNew = new QPushButton(QString::null, hb);
+ m_buttonNew->setPixmap(BarIcon("filenew", KIcon::SizeSmall));
+ m_buttonNew->setMinimumSize(m_buttonNew->sizeHint() * 1.2);
+
+ m_buttonCopy = new QPushButton(QString::null, hb);
+ m_buttonCopy->setPixmap(BarIcon("editcopy", KIcon::SizeSmall));
+ m_buttonCopy->setMinimumSize(m_buttonCopy->sizeHint() * 1.2);
+
+ m_buttonDelete = new QPushButton(QString::null, hb);
+ m_buttonDelete->setPixmap(BarIcon("editdelete", KIcon::SizeSmall));
+ m_buttonDelete->setMinimumSize(m_buttonDelete->sizeHint() * 1.2);
+
+ m_buttonRename = new QPushButton(i18n("Rename..."), hb);
+
+ QToolTip::add(m_buttonNew, i18n("New"));
+ QToolTip::add(m_buttonCopy, i18n("Copy"));
+ QToolTip::add(m_buttonDelete, i18n("Delete"));
+
+ // Connect the signals
+ connect(m_buttonNew, SIGNAL(clicked()), this, SLOT(slotNewRule()));
+ connect(m_buttonDelete, SIGNAL(clicked()), this, SLOT(slotDeleteRule()));
+ connect(m_buttonRename, SIGNAL(clicked()), this, SLOT(slotRenameRule()));
+ connect(m_buttonCopy, SIGNAL(clicked()), this, SLOT(slotCopyRule()));
+
+ connect(m_buttonUp, SIGNAL(clicked()), this, SLOT(slotUp()));
+ connect(m_buttonDown, SIGNAL(clicked()), this, SLOT(slotDown()));
+
+ connect(m_listView, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotSelectionChanged(QListViewItem*)));
+
+ m_buttonUp->setEnabled(false);
+ m_buttonDown->setEnabled(false);
+ m_buttonRename->setEnabled(false);
+
+ // Reset the view, loading all the existing rules
+ reset();
+}
+
+void FilterListView::reset()
+{
+ m_listView->clear();
+
+ // Load all existing rules
+ Filters *filters = Filters::self();
+ Filters::ConstIterator le = filters->end();
+
+ for (Filters::ConstIterator i = filters->begin(); i != le; ++i) {
+ FilterListItem *item = new FilterListItem(m_listView, (*i));
+ item->moveItem(m_listView->lastItem());
+ }
+
+ // Select the first rule
+ m_listView->setSelected(m_listView->firstChild(), true);
+}
+
+void FilterListView::slotSelectionChanged(QListViewItem *item)
+{
+ FilterListItem *selected = static_cast<FilterListItem*>(item);
+
+ m_buttonUp->setEnabled(item->itemAbove());
+ m_buttonDown->setEnabled(item->nextSibling());
+ m_buttonRename->setEnabled(true);
+
+ // Signal the rule change
+ emit ruleChanged(selected->rule());
+}
+
+void FilterListView::slotNewRule()
+{
+ Rule *rule = new Rule(i18n("Unnamed Rule"));
+ FilterListItem *selected = static_cast<FilterListItem*>(m_listView->selectedItem());
+ FilterListItem *item = new FilterListItem(m_listView, rule);
+
+ if (selected) {
+ Filters::self()->insert(Filters::self()->findRef(selected->rule()) + 1, rule);
+ item->moveItem(selected);
+ } else {
+ Filters::self()->append(rule);
+ }
+
+ m_listView->setSelected(item, true);
+}
+
+void FilterListView::slotDeleteRule()
+{
+ FilterListItem *selected = static_cast<FilterListItem*>(m_listView->selectedItem());
+
+ if (selected) {
+ Rule *rule = selected->rule();
+ delete selected;
+
+ emit ruleRemoved();
+
+ Filters::self()->removeRef(rule);
+ m_listView->setSelected(m_listView->lastItem(), true);
+ }
+
+ if (!m_listView->selectedItem())
+ m_buttonRename->setEnabled(false);
+}
+
+void FilterListView::slotRenameRule()
+{
+ FilterListItem *selected = static_cast<FilterListItem*>(m_listView->selectedItem());
+
+ if (selected) {
+ QString name = KInputDialog::getText(i18n("Rename Rule"), i18n("Rename rule '%1' to:").arg(selected->rule()->name()), selected->rule()->name());
+
+ if (name.stripWhiteSpace().isEmpty())
+ name = i18n("Unnamed Rule");
+
+ selected->rule()->setName(name);
+ selected->setText(0, name);
+ }
+}
+
+void FilterListView::slotCopyRule()
+{
+ FilterListItem *selected = static_cast<FilterListItem*>(m_listView->selectedItem());
+
+ if (selected) {
+ Rule *rule = new Rule(selected->rule());
+ FilterListItem *item = new FilterListItem(m_listView, rule);
+
+ Filters::self()->insert(Filters::self()->findRef(selected->rule()) + 1, rule);
+ item->moveItem(selected);
+ m_listView->setSelected(item, true);
+ }
+}
+
+void FilterListView::slotUp()
+{
+ FilterListItem *selected = static_cast<FilterListItem*>(m_listView->selectedItem());
+ QListViewItem *tmp = selected->itemAbove();
+ if (!tmp)
+ return;
+
+ FilterListItem *previous = static_cast<FilterListItem*>(tmp->itemAbove());
+
+ if (selected) {
+ Rule *rule = Filters::self()->take(Filters::self()->findRef(selected->rule()));
+
+ if (previous) {
+ Filters::self()->insert(Filters::self()->findRef(previous->rule()) + 1, rule);
+ selected->moveItem(previous);
+ } else {
+ Filters::self()->insert(0, rule);
+ m_listView->takeItem(selected);
+ m_listView->insertItem(selected);
+ m_listView->setSelected(selected, true);
+ }
+
+ m_buttonUp->setEnabled(selected->itemAbove());
+ m_buttonDown->setEnabled(selected->nextSibling());
+ }
+}
+
+void FilterListView::slotDown()
+{
+ FilterListItem *selected = static_cast<FilterListItem*>(m_listView->selectedItem());
+ FilterListItem *next = static_cast<FilterListItem*>(selected->nextSibling());
+
+ if (selected && next) {
+ Rule *rule = Filters::self()->take(Filters::self()->findRef(selected->rule()));
+ Filters::self()->insert(Filters::self()->findRef(next->rule()) + 1, rule);
+ selected->moveItem(next);
+
+ m_buttonUp->setEnabled(selected->itemAbove());
+ m_buttonDown->setEnabled(selected->nextSibling());
+ }
+}
+
+FilterConditionsList::FilterConditionsList(QWidget *parent)
+ : QGroupBox(1, Horizontal, i18n("Conditions"), parent)
+{
+ setEnabled(false);
+
+ m_buttonAll = new QRadioButton(i18n("Match a&ll of the following"), this);
+ m_buttonAny = new QRadioButton(i18n("Match an&y of the following"), this);
+
+ m_buttonAll->setChecked(true);
+ m_buttonAny->setChecked(false);
+
+ QButtonGroup *bg = new QButtonGroup(this);
+ bg->hide();
+ bg->insert(m_buttonAll, (int) ConditionChain::All);
+ bg->insert(m_buttonAny, (int) ConditionChain::Any);
+
+ // Connect some signals
+ connect(bg, SIGNAL(clicked(int)), this, SLOT(slotMatchTypeChanged(int)));
+
+ m_lister = new FilterConditionWidgetLister(this);
+}
+
+void FilterConditionsList::reset()
+{
+ m_lister->clear();
+ setEnabled(false);
+}
+
+void FilterConditionsList::loadRule(Rule *rule)
+{
+ m_rule = rule;
+
+ switch (rule->conditions()->type()) {
+ case ConditionChain::All: m_buttonAll->setChecked(true); break;
+ case ConditionChain::Any: m_buttonAny->setChecked(true); break;
+ }
+
+ m_lister->loadConditions(rule);
+ setEnabled(true);
+}
+
+void FilterConditionsList::slotMatchTypeChanged(int type)
+{
+ if (m_rule)
+ const_cast<ConditionChain*>(m_rule->conditions())->setType((ConditionChain::Type) type);
+}
+
+FilterConditionWidgetLister::FilterConditionWidgetLister(QWidget *parent)
+ : WidgetLister(parent, 0, 7),
+ m_rule(0)
+{
+ setMinimumWidth(400);
+}
+
+void FilterConditionWidgetLister::loadConditions(KFTPCore::Filter::Rule *rule)
+{
+ const ConditionChain *conditions = rule->conditions();
+
+ // Clear the current list
+ setNumberShown(QMAX(conditions->count(), 0));
+
+ ConditionChain::ConstIterator le = conditions->end();
+ QPtrList<QWidget>::Iterator wi = m_widgetList.begin();
+ for (ConditionChain::ConstIterator i = conditions->begin(); i != le; ++i, ++wi)
+ static_cast<FilterConditionWidget*>((*wi))->setCondition((*i));
+
+ m_rule = rule;
+}
+
+void FilterConditionWidgetLister::slotMore()
+{
+ WidgetLister::slotMore();
+
+ // Actually add the condition and update the latest widget
+ Condition *condition = new Condition(Filename, Condition::Contains, QVariant(""));
+
+ const_cast<ConditionChain*>(m_rule->conditions())->append(condition);
+ static_cast<FilterConditionWidget*>(m_widgetList.last())->setCondition(condition);
+}
+
+void FilterConditionWidgetLister::slotFewer()
+{
+ // Actually remove the condition
+ Condition *condition = static_cast<FilterConditionWidget*>(m_widgetList.last())->condition();
+ const_cast<ConditionChain*>(m_rule->conditions())->remove(condition);
+
+ WidgetLister::slotFewer();
+}
+
+void FilterConditionWidgetLister::slotClear()
+{
+ if (m_rule)
+ const_cast<ConditionChain*>(m_rule->conditions())->clear();
+
+ WidgetLister::slotClear();
+}
+
+QWidget *FilterConditionWidgetLister::createWidget(QWidget *parent)
+{
+ return new FilterConditionWidget(parent);
+}
+
+FilterConditionWidget::FilterConditionWidget(QWidget *parent)
+ : QWidget(parent),
+ m_condition(0)
+{
+ QHBoxLayout *layout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ m_fieldCombo = new QComboBox(this);
+ m_fieldCombo->insertStringList(Filters::self()->getFieldNames());
+ layout->addWidget(m_fieldCombo);
+
+ m_typeStack = new QWidgetStack(this);
+ m_typeStack->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ layout->addWidget(m_typeStack);
+
+ m_valueStack = new QWidgetStack(this);
+ m_valueStack->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ layout->addWidget(m_valueStack);
+ layout->setStretchFactor(m_valueStack, 10);
+
+ // Initialize widgets
+ WidgetHandlerManager::self()->createConditionWidgets(m_typeStack, m_valueStack, this);
+
+ // Connect signals
+ connect(m_fieldCombo, SIGNAL(activated(int)), this, SLOT(slotFieldChanged(int)));
+
+ setFocusProxy(m_fieldCombo);
+}
+
+void FilterConditionWidget::setCondition(const Condition *condition)
+{
+ m_condition = const_cast<Condition*>(condition);
+
+ m_fieldCombo->setCurrentItem((int) condition->field());
+ WidgetHandlerManager::self()->setCondition(m_typeStack, m_valueStack, condition);
+}
+
+void FilterConditionWidget::slotFieldChanged(int field)
+{
+ WidgetHandlerManager::self()->update((Field) field, m_typeStack, m_valueStack);
+
+ if (m_condition) {
+ // Update the current condition
+ m_condition->setField((Field) field);
+ slotTypeChanged();
+ }
+}
+
+void FilterConditionWidget::slotTypeChanged()
+{
+ if (m_condition) {
+ // Update the current condition
+ m_condition->setType(WidgetHandlerManager::self()->getConditionType(m_condition->field(), m_typeStack));
+ slotValueChanged();
+ }
+}
+
+void FilterConditionWidget::slotValueChanged()
+{
+ if (m_condition) {
+ // Update the current condition
+ m_condition->setValue(WidgetHandlerManager::self()->getConditionValue(m_condition->field(), m_valueStack));
+ }
+}
+
+FilterActionsList::FilterActionsList(QWidget *parent)
+ : QGroupBox(1, Horizontal, i18n("Actions"), parent)
+{
+ setEnabled(false);
+
+ m_lister = new FilterActionWidgetLister(this);
+}
+
+void FilterActionsList::reset()
+{
+ m_lister->clear();
+ setEnabled(false);
+}
+
+void FilterActionsList::loadRule(Rule *rule)
+{
+ m_rule = rule;
+
+ m_lister->loadActions(rule);
+ setEnabled(true);
+}
+
+FilterActionWidgetLister::FilterActionWidgetLister(QWidget *parent)
+ : WidgetLister(parent, 0, 7),
+ m_rule(0)
+{
+ setMinimumWidth(400);
+}
+
+void FilterActionWidgetLister::loadActions(KFTPCore::Filter::Rule *rule)
+{
+ const ActionChain *actions = rule->actions();
+
+ // Clear the current list
+ setNumberShown(QMAX(actions->count(), 0));
+
+ ActionChain::ConstIterator le = actions->end();
+ QPtrList<QWidget>::Iterator wi = m_widgetList.begin();
+ for (ActionChain::ConstIterator i = actions->begin(); i != le; ++i, ++wi)
+ static_cast<FilterActionWidget*>((*wi))->setAction((*i));
+
+ m_rule = rule;
+}
+
+void FilterActionWidgetLister::slotMore()
+{
+ WidgetLister::slotMore();
+
+ // Actually add the action and update the latest widget
+ Action *action = new Action(Action::None, QVariant());
+
+ const_cast<ActionChain*>(m_rule->actions())->append(action);
+ static_cast<FilterActionWidget*>(m_widgetList.last())->setAction(action);
+}
+
+void FilterActionWidgetLister::slotFewer()
+{
+ // Actually remove the action
+ Action *action = static_cast<FilterActionWidget*>(m_widgetList.last())->action();
+ const_cast<ActionChain*>(m_rule->actions())->remove(action);
+
+ WidgetLister::slotFewer();
+}
+
+void FilterActionWidgetLister::slotClear()
+{
+ if (m_rule)
+ const_cast<ActionChain*>(m_rule->actions())->clear();
+
+ WidgetLister::slotClear();
+}
+
+QWidget *FilterActionWidgetLister::createWidget(QWidget *parent)
+{
+ return new FilterActionWidget(parent);
+}
+
+FilterActionWidget::FilterActionWidget(QWidget *parent)
+ : QWidget(parent),
+ m_action(0)
+{
+ QHBoxLayout *layout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ m_actionCombo = new QComboBox(this);
+ m_actionCombo->insertStringList(Filters::self()->getActionNames());
+ layout->addWidget(m_actionCombo);
+
+ m_valueStack = new QWidgetStack(this);
+ m_valueStack->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
+ layout->addWidget(m_valueStack);
+ layout->setStretchFactor(m_valueStack, 10);
+
+ // Initialize widgets
+ WidgetHandlerManager::self()->createActionWidgets(m_valueStack, this);
+
+ // Connect signals
+ connect(m_actionCombo, SIGNAL(activated(int)), this, SLOT(slotActionChanged(int)));
+ connect(m_actionCombo, SIGNAL(activated(int)), m_valueStack, SLOT(raiseWidget(int)));
+
+ setFocusProxy(m_actionCombo);
+}
+
+void FilterActionWidget::setAction(const Action *action)
+{
+ m_action = const_cast<Action*>(action);
+
+ m_actionCombo->setCurrentItem((int) action->type());
+ WidgetHandlerManager::self()->setAction(m_valueStack, action);
+}
+
+void FilterActionWidget::slotActionChanged(int field)
+{
+ if (m_action) {
+ m_action->setType((Action::Type) field);
+ slotValueChanged();
+ }
+}
+
+void FilterActionWidget::slotValueChanged()
+{
+ if (m_action)
+ m_action->setValue(WidgetHandlerManager::self()->getActionValue(m_valueStack));
+}
+
+}
+
+#include "filtereditor.moc"
+
diff --git a/kftpgrabber/src/widgets/filtereditor.h b/kftpgrabber/src/widgets/filtereditor.h
new file mode 100644
index 0000000..95fd664
--- /dev/null
+++ b/kftpgrabber/src/widgets/filtereditor.h
@@ -0,0 +1,375 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETSFILTEREDITOR_H
+#define KFTPWIDGETSFILTEREDITOR_H
+
+#include "widgetlister.h"
+#include "misc/filter.h"
+
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qlistview.h>
+#include <qradiobutton.h>
+#include <qcombobox.h>
+#include <qwidgetstack.h>
+#include <qcheckbox.h>
+
+#include <kpushbutton.h>
+
+namespace KFTPWidgets {
+
+class ListView;
+
+/**
+ * A visual representation of a condition.
+ *
+ * @author Jernej Kos
+ */
+class FilterConditionWidget : public QWidget {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterConditionWidget(QWidget *parent);
+
+ /**
+ * Associate a condition with this widget.
+ *
+ * @param condition The internal condition representation
+ */
+ void setCondition(const KFTPCore::Filter::Condition *condition);
+
+ /**
+ * Return the condition associated with this widget.
+ *
+ * @return A valid condition or 0 if no condition has been associated
+ */
+ KFTPCore::Filter::Condition *condition() const { return m_condition; }
+private slots:
+ void slotFieldChanged(int field);
+ void slotTypeChanged();
+ void slotValueChanged();
+private:
+ QComboBox *m_fieldCombo;
+ QWidgetStack *m_typeStack;
+ QWidgetStack *m_valueStack;
+
+ KFTPCore::Filter::Condition *m_condition;
+};
+
+/**
+ * A container for condition representation widgets.
+ *
+ * @author Jernej Kos
+ */
+class FilterConditionWidgetLister : public WidgetLister {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterConditionWidgetLister(QWidget *parent);
+
+ /**
+ * Load the conditions from the specified rule.
+ *
+ * @param rule The rule instance
+ */
+ void loadConditions(KFTPCore::Filter::Rule *rule);
+protected:
+ QWidget *createWidget(QWidget *parent);
+protected slots:
+ void slotMore();
+ void slotFewer();
+ void slotClear();
+private:
+ KFTPCore::Filter::Rule *m_rule;
+};
+
+/**
+ * A list of conditions together with all/any configuration.
+ *
+ * @author Jernej Kos
+ */
+class FilterConditionsList : public QGroupBox {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterConditionsList(QWidget *parent);
+public slots:
+ /**
+ * Reset the condition list and disable it.
+ */
+ void reset();
+
+ /**
+ * Load the conditions from the specified rule.
+ *
+ * @param rule The rule instance
+ */
+ void loadRule(KFTPCore::Filter::Rule *rule);
+private slots:
+ void slotMatchTypeChanged(int type);
+private:
+ QRadioButton *m_buttonAll;
+ QRadioButton *m_buttonAny;
+
+ FilterConditionWidgetLister *m_lister;
+ KFTPCore::Filter::Rule *m_rule;
+};
+
+/**
+ * A visual representation of an action.
+ *
+ * @author Jernej Kos
+ */
+class FilterActionWidget : public QWidget {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterActionWidget(QWidget *parent);
+
+ /**
+ * Associate an action with this widget.
+ *
+ * @param action The internal action representation
+ */
+ void setAction(const KFTPCore::Filter::Action *action);
+
+ /**
+ * Return the action associated with this widget.
+ *
+ * @return A valid action or 0 if no action has been associated
+ */
+ KFTPCore::Filter::Action *action() const { return m_action; }
+private slots:
+ void slotActionChanged(int field);
+ void slotValueChanged();
+private:
+ QComboBox *m_actionCombo;
+ QWidgetStack *m_valueStack;
+
+ KFTPCore::Filter::Action *m_action;
+};
+
+/**
+ * A container for action representation widgets.
+ *
+ * @author Jernej Kos
+ */
+class FilterActionWidgetLister : public WidgetLister {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterActionWidgetLister(QWidget *parent);
+
+ /**
+ * Load the actions from the specified rule.
+ *
+ * @param rule The rule instance
+ */
+ void loadActions(KFTPCore::Filter::Rule *rule);
+protected:
+ QWidget *createWidget(QWidget *parent);
+protected slots:
+ void slotMore();
+ void slotFewer();
+ void slotClear();
+private:
+ KFTPCore::Filter::Rule *m_rule;
+};
+
+/**
+ * A list of actions.
+ *
+ * @author Jernej Kos
+ */
+class FilterActionsList : public QGroupBox {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterActionsList(QWidget *parent);
+public slots:
+ /**
+ * Reset the action list and disable it.
+ */
+ void reset();
+
+ /**
+ * Load the actions from the specified rule.
+ *
+ * @param rule The rule instance
+ */
+ void loadRule(KFTPCore::Filter::Rule *rule);
+private:
+ FilterActionWidgetLister *m_lister;
+ KFTPCore::Filter::Rule *m_rule;
+};
+
+/**
+ * A widget that displays the list of currently loaded filter rules.
+ *
+ * @author Jernej Kos
+ */
+class FilterListView : public QGroupBox {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ FilterListView(QWidget *parent);
+
+ /**
+ * Reset the filter editor and reload all the rules.
+ */
+ void reset();
+private slots:
+ void slotSelectionChanged(QListViewItem *item);
+
+ void slotNewRule();
+ void slotDeleteRule();
+ void slotRenameRule();
+ void slotCopyRule();
+
+ void slotUp();
+ void slotDown();
+private:
+ ListView *m_listView;
+
+ KPushButton *m_buttonUp;
+ KPushButton *m_buttonDown;
+
+ QPushButton *m_buttonNew;
+ QPushButton *m_buttonCopy;
+ QPushButton *m_buttonDelete;
+ QPushButton *m_buttonRename;
+signals:
+ /**
+ * This signal gets emitted when a new rule should be displayed by
+ * other widgets.
+ *
+ * @param rule The rule to display
+ */
+ void ruleChanged(KFTPCore::Filter::Rule *rule);
+
+ /**
+ * This signal gets emitted when a rule is removed.
+ */
+ void ruleRemoved();
+};
+
+/**
+ * An item visually representing a filter rule.
+ *
+ * @author Jernej Kos
+ */
+class FilterListItem : public QListViewItem {
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent The parent list view
+ * @param rule Rule this item represents
+ */
+ FilterListItem(ListView *parent, KFTPCore::Filter::Rule *rule);
+
+ /**
+ * Get the rule this item represents.
+ */
+ KFTPCore::Filter::Rule *rule() { return m_rule; }
+private:
+ KFTPCore::Filter::Rule *m_rule;
+};
+
+/**
+ * This widget is a global filter editor and enables the user to add,
+ * remove or modify existing filters.
+ *
+ * @author Jernej Kos
+ */
+class FilterEditor : public QWidget {
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ */
+ FilterEditor(QWidget *parent);
+
+ /**
+ * Reset the filter editor and reload all the rules.
+ */
+ void reset();
+private slots:
+ void slotRuleChanged(KFTPCore::Filter::Rule *rule);
+ void slotRuleRemoved();
+
+ void slotEnabledChanged();
+private:
+ KFTPCore::Filter::Rule *m_rule;
+
+ QCheckBox *m_enabledCheck;
+ FilterListView *m_listView;
+ FilterConditionsList *m_conditionsList;
+ FilterActionsList *m_actionsList;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/kftpfilteraddpatternlayout.cpp b/kftpgrabber/src/widgets/kftpfilteraddpatternlayout.cpp
new file mode 100644
index 0000000..50c403b
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpfilteraddpatternlayout.cpp
@@ -0,0 +1,92 @@
+#include <klocale.h>
+/****************************************************************************
+** Form implementation generated from reading ui file '/home/kostko/development/kftpgrabber/src/widgets/kftpfilteraddpatternlayout.ui'
+**
+** Created: Mon Oct 20 18:26:31 2003
+** by: The User Interface Compiler ($Id: kftpfilteraddpatternlayout.cpp,v 1.1.1.1 2004/02/13 13:33:43 kostko Exp $)
+**
+** WARNING! All changes made in this file will be lost!
+****************************************************************************/
+
+#include "kftpfilteraddpatternlayout.h"
+
+#include <qvariant.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+#include <klineedit.h>
+#include <kcolorbutton.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+/*
+ * Constructs a KFTPFilterAddPatternLayout as a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'.
+ */
+KFTPFilterAddPatternLayout::KFTPFilterAddPatternLayout( QWidget* parent, const char* name, WFlags fl )
+ : QWidget( parent, name, fl )
+{
+ if ( !name )
+ setName( "KFTPFilterAddPatternLayout" );
+ KFTPFilterAddPatternLayoutLayout = new QGridLayout( this, 1, 1, 11, 6, "KFTPFilterAddPatternLayoutLayout");
+
+ groupBox1 = new QGroupBox( this, "groupBox1" );
+ groupBox1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)2, 0, 0, groupBox1->sizePolicy().hasHeightForWidth() ) );
+ groupBox1->setColumnLayout(0, Qt::Vertical );
+ groupBox1->layout()->setSpacing( 6 );
+ groupBox1->layout()->setMargin( 11 );
+ groupBox1Layout = new QGridLayout( groupBox1->layout() );
+ groupBox1Layout->setAlignment( Qt::AlignTop );
+
+ layout9 = new QHBoxLayout( 0, 0, 6, "layout9");
+
+ layout8 = new QVBoxLayout( 0, 0, 6, "layout8");
+
+ textLabel1 = new QLabel( groupBox1, "textLabel1" );
+ layout8->addWidget( textLabel1 );
+
+ textLabel2 = new QLabel( groupBox1, "textLabel2" );
+ layout8->addWidget( textLabel2 );
+ layout9->addLayout( layout8 );
+
+ layout7 = new QVBoxLayout( 0, 0, 6, "layout7");
+
+ kLineEdit1 = new KLineEdit( groupBox1, "kLineEdit1" );
+ layout7->addWidget( kLineEdit1 );
+
+ kColorButton1 = new KColorButton( groupBox1, "kColorButton1" );
+ kColorButton1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, kColorButton1->sizePolicy().hasHeightForWidth() ) );
+ layout7->addWidget( kColorButton1 );
+ layout9->addLayout( layout7 );
+
+ groupBox1Layout->addLayout( layout9, 0, 0 );
+
+ KFTPFilterAddPatternLayoutLayout->addWidget( groupBox1, 0, 0 );
+ languageChange();
+ resize( QSize(380, 110).expandedTo(minimumSizeHint()) );
+ clearWState( WState_Polished );
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+KFTPFilterAddPatternLayout::~KFTPFilterAddPatternLayout()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+/*
+ * Sets the strings of the subwidgets using the current
+ * language.
+ */
+void KFTPFilterAddPatternLayout::languageChange()
+{
+ setCaption( tr2i18n( "Form1" ) );
+ groupBox1->setTitle( tr2i18n( "New Pattern" ) );
+ textLabel1->setText( tr2i18n( "Filename pattern:" ) );
+ textLabel2->setText( tr2i18n( "Color:" ) );
+ kColorButton1->setText( QString::null );
+}
+
+#include "kftpfilteraddpatternlayout.moc"
diff --git a/kftpgrabber/src/widgets/kftpfiltereditorlayout.cpp b/kftpgrabber/src/widgets/kftpfiltereditorlayout.cpp
new file mode 100644
index 0000000..b52913c
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpfiltereditorlayout.cpp
@@ -0,0 +1,115 @@
+#include <klocale.h>
+/****************************************************************************
+** Form implementation generated from reading ui file '/home/kostko/development/kftpgrabber/src/widgets/kftpfiltereditorlayout.ui'
+**
+** Created: Mon Oct 20 16:14:00 2003
+** by: The User Interface Compiler ($Id: kftpfiltereditorlayout.cpp,v 1.1.1.1 2004/02/13 13:33:43 kostko Exp $)
+**
+** WARNING! All changes made in this file will be lost!
+****************************************************************************/
+
+#include "kftpfiltereditorlayout.h"
+
+#include <qvariant.h>
+#include <qpushbutton.h>
+#include <qtabwidget.h>
+#include <kpushbutton.h>
+#include <qheader.h>
+#include <klistview.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+
+/*
+ * Constructs a KFTPFilterEditorLayout as a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'.
+ */
+KFTPFilterEditorLayout::KFTPFilterEditorLayout( QWidget* parent, const char* name, WFlags fl )
+ : QWidget( parent, name, fl )
+{
+ if ( !name )
+ setName( "KFTPFilterEditorLayout" );
+ KFTPFilterEditorLayoutLayout = new QGridLayout( this, 1, 1, 11, 6, "KFTPFilterEditorLayoutLayout");
+
+ tabWidget2 = new QTabWidget( this, "tabWidget2" );
+
+ tab = new QWidget( tabWidget2, "tab" );
+ tabLayout = new QGridLayout( tab, 1, 1, 11, 6, "tabLayout");
+
+ layout1 = new QVBoxLayout( 0, 0, 6, "layout1");
+
+ addPatternButton = new KPushButton( tab, "addPatternButton" );
+ layout1->addWidget( addPatternButton );
+
+ editPatternButton = new KPushButton( tab, "editPatternButton" );
+ layout1->addWidget( editPatternButton );
+
+ removePatternButton = new KPushButton( tab, "removePatternButton" );
+ layout1->addWidget( removePatternButton );
+
+ tabLayout->addLayout( layout1, 0, 1 );
+ QSpacerItem* spacer = new QSpacerItem( 31, 111, QSizePolicy::Minimum, QSizePolicy::Expanding );
+ tabLayout->addItem( spacer, 1, 1 );
+
+ layout2 = new QVBoxLayout( 0, 0, 6, "layout2");
+
+ patternList = new KListView( tab, "patternList" );
+ patternList->addColumn( tr2i18n( "Pattern" ) );
+ patternList->addColumn( tr2i18n( "Color" ) );
+ layout2->addWidget( patternList );
+
+ enabledCheck = new QCheckBox( tab, "enabledCheck" );
+ layout2->addWidget( enabledCheck );
+
+ tabLayout->addMultiCellLayout( layout2, 0, 1, 0, 0 );
+ tabWidget2->insertTab( tab, QString("") );
+
+ tab_2 = new QWidget( tabWidget2, "tab_2" );
+
+ textLabel1 = new QLabel( tab_2, "textLabel1" );
+ textLabel1->setGeometry( QRect( 10, 10, 130, 20 ) );
+ tabWidget2->insertTab( tab_2, QString("") );
+
+ tab_3 = new QWidget( tabWidget2, "tab_3" );
+
+ textLabel1_2 = new QLabel( tab_3, "textLabel1_2" );
+ textLabel1_2->setGeometry( QRect( 10, 10, 130, 20 ) );
+ tabWidget2->insertTab( tab_3, QString("") );
+
+ KFTPFilterEditorLayoutLayout->addWidget( tabWidget2, 0, 0 );
+ languageChange();
+ resize( QSize(456, 299).expandedTo(minimumSizeHint()) );
+ clearWState( WState_Polished );
+}
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+KFTPFilterEditorLayout::~KFTPFilterEditorLayout()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+/*
+ * Sets the strings of the subwidgets using the current
+ * language.
+ */
+void KFTPFilterEditorLayout::languageChange()
+{
+ setCaption( tr2i18n( "Form1" ) );
+ addPatternButton->setText( tr2i18n( "Add pattern" ) );
+ editPatternButton->setText( tr2i18n( "Edit" ) );
+ removePatternButton->setText( tr2i18n( "Remove" ) );
+ patternList->header()->setLabel( 0, tr2i18n( "Pattern" ) );
+ patternList->header()->setLabel( 1, tr2i18n( "Color" ) );
+ enabledCheck->setText( tr2i18n( "Enabled" ) );
+ tabWidget2->changeTab( tab, tr2i18n( "Highlighting" ) );
+ textLabel1->setText( tr2i18n( "<b>Not yet implemented.</b>" ) );
+ tabWidget2->changeTab( tab_2, tr2i18n( "Skip List" ) );
+ textLabel1_2->setText( tr2i18n( "<b>Not yet implemented.</b>" ) );
+ tabWidget2->changeTab( tab_3, tr2i18n( "ASCII xtensions" ) );
+}
+
+#include "kftpfiltereditorlayout.moc"
diff --git a/kftpgrabber/src/widgets/kftpselectserverdialog.cpp b/kftpgrabber/src/widgets/kftpselectserverdialog.cpp
new file mode 100644
index 0000000..f3b6b3a
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpselectserverdialog.cpp
@@ -0,0 +1,79 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpbookmarks.h"
+#include "kftpselectserverdialog.h"
+#include "kftpbookmarks.h"
+#include "bookmarks/listview.h"
+#include "misc.h"
+
+#include <klistview.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+using namespace KFTPGrabberBase;
+
+KFTPSelectServerDialog::KFTPSelectServerDialog(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, "Select a server", KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok), m_selectedSite(0)
+{
+ m_tree = new KFTPWidgets::Bookmarks::ListView(KFTPBookmarks::Manager::self(), this);
+ m_tree->setMinimumWidth(270);
+ m_tree->fillBookmarkData();
+
+ connect(m_tree, SIGNAL(clicked(QListViewItem*)), this, SLOT(slotTreeClicked()));
+
+ // Set some stuff
+ setMainWidget(m_tree);
+ enableButtonOK(false);
+}
+
+void KFTPSelectServerDialog::slotTreeClicked()
+{
+ enableButtonOK(false);
+
+ if (m_tree->selectedItem()) {
+ if (static_cast<KFTPWidgets::Bookmarks::ListViewItem*>(m_tree->selectedItem())->m_type == 1) {
+ // Set the active server
+ m_selectedSite = static_cast<KFTPWidgets::Bookmarks::ListViewItem*>(m_tree->selectedItem())->m_site;
+
+ enableButtonOK(true);
+ return;
+ }
+ }
+}
+
+
+#include "kftpselectserverdialog.moc"
diff --git a/kftpgrabber/src/widgets/kftpselectserverdialog.h b/kftpgrabber/src/widgets/kftpselectserverdialog.h
new file mode 100644
index 0000000..8c4afd3
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpselectserverdialog.h
@@ -0,0 +1,70 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPSELECTSERVERDIALOG_H
+#define KFTPSELECTSERVERDIALOG_H
+
+#include <kdialogbase.h>
+#include <qdom.h>
+#include <qlistview.h>
+
+namespace KFTPBookmarks {
+ class Site;
+}
+
+namespace KFTPWidgets {
+namespace Bookmarks {
+ class ListView;
+}
+}
+
+/**
+@author Jernej Kos
+*/
+class KFTPSelectServerDialog : public KDialogBase
+{
+Q_OBJECT
+public:
+ KFTPSelectServerDialog(QWidget *parent = 0, const char *name = 0);
+
+ KFTPBookmarks::Site *getSelectedSite() { return m_selectedSite; }
+private:
+ KFTPWidgets::Bookmarks::ListView *m_tree;
+ KFTPBookmarks::Site *m_selectedSite;
+private slots:
+ void slotTreeClicked();
+};
+
+#endif
diff --git a/kftpgrabber/src/widgets/kftpserverlineedit.cpp b/kftpgrabber/src/widgets/kftpserverlineedit.cpp
new file mode 100644
index 0000000..87e94e3
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpserverlineedit.cpp
@@ -0,0 +1,105 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpbookmarks.h"
+#include "kftpserverlineedit.h"
+#include "kftpselectserverdialog.h"
+
+#include <kdialog.h>
+#include <kpushbutton.h>
+#include <klocale.h>
+
+#include <qlayout.h>
+
+KFTPServerLineEdit::KFTPServerLineEdit(QWidget *parent, const char *name, WFlags f)
+ : QWidget(parent, name, f), m_currentSite(0)
+{
+ QHBoxLayout *layout = new QHBoxLayout(this, 0, KDialog::spacingHint());
+
+ m_lineEdit = new KLineEdit(this);
+ m_lineEdit->setReadOnly(true);
+
+ KPushButton *selectButton = new KPushButton(i18n("Select..."), this);
+ selectButton->setFlat(true);
+ connect(selectButton, SIGNAL(clicked()), this, SLOT(slotSelectButtonClicked()));
+
+ layout->addWidget(m_lineEdit);
+ layout->addWidget(selectButton);
+}
+
+KFTPServerLineEdit::~KFTPServerLineEdit()
+{
+}
+
+void KFTPServerLineEdit::setCurrentSite(KFTPBookmarks::Site *site)
+{
+ if (site) {
+ m_currentSite = site;
+ m_lineEdit->setText(m_currentSite->getAttribute("name"));
+
+ emit siteChanged(m_currentSite);
+ } else {
+ m_currentSite = 0L;
+
+ clear();
+ }
+}
+
+void KFTPServerLineEdit::clear()
+{
+ m_lineEdit->clear();
+}
+
+void KFTPServerLineEdit::slotSelectButtonClicked()
+{
+ KFTPSelectServerDialog *dialog = new KFTPSelectServerDialog(this);
+
+ if (dialog->exec() == QDialog::Accepted) {
+ m_currentSite = dialog->getSelectedSite();
+
+ if (m_currentSite)
+ m_lineEdit->setText(m_currentSite->getAttribute("name"));
+ else
+ m_lineEdit->setText(i18n("No name"));
+
+ emit siteChanged(m_currentSite);
+ }
+
+ delete dialog;
+}
+
+
+
+#include "kftpserverlineedit.moc"
diff --git a/kftpgrabber/src/widgets/kftpserverlineedit.h b/kftpgrabber/src/widgets/kftpserverlineedit.h
new file mode 100644
index 0000000..dd471ae
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpserverlineedit.h
@@ -0,0 +1,71 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPSERVERLINEEDIT_H
+#define KFTPSERVERLINEEDIT_H
+
+#include <qwidget.h>
+#include <qdom.h>
+
+#include <klineedit.h>
+
+namespace KFTPBookmarks {
+ class Site;
+}
+
+/**
+@author Jernej Kos
+*/
+class KFTPServerLineEdit : public QWidget
+{
+Q_OBJECT
+public:
+ KFTPServerLineEdit(QWidget *parent = 0, const char *name = 0, WFlags f = 0);
+ ~KFTPServerLineEdit();
+
+ KFTPBookmarks::Site *getCurrentSite() { return m_currentSite; }
+ void setCurrentSite(KFTPBookmarks::Site *site);
+
+ void clear();
+private:
+ KFTPBookmarks::Site *m_currentSite;
+ KLineEdit *m_lineEdit;
+private slots:
+ void slotSelectButtonClicked();
+signals:
+ void siteChanged(KFTPBookmarks::Site *site);
+};
+
+#endif
diff --git a/kftpgrabber/src/widgets/kftptabwidget.cpp b/kftpgrabber/src/widgets/kftptabwidget.cpp
new file mode 100644
index 0000000..317f887
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftptabwidget.cpp
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftptabwidget.h"
+#include "kftptabwidget.moc"
+
+KFTPTabWidget::KFTPTabWidget( QWidget* parent, const char* name )
+ : KTabWidget ( parent, name )
+{
+}
+
+
+KFTPTabWidget::~KFTPTabWidget()
+{
+}
+
+void KFTPTabWidget::mousePressEvent( QMouseEvent* )
+{
+ emit mouseEvent( this->name() );
+}
diff --git a/kftpgrabber/src/widgets/kftptabwidget.h b/kftpgrabber/src/widgets/kftptabwidget.h
new file mode 100644
index 0000000..d17efe3
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftptabwidget.h
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPTABWIDGET_H
+#define KFTPTABWIDGET_H
+
+#include <ktabwidget.h>
+
+/**
+@author Blacknator
+*/
+class KFTPTabWidget : public KTabWidget
+{
+ private:
+ Q_OBJECT
+
+ public:
+ KFTPTabWidget( QWidget* parent = 0, const char* name = 0 );
+ ~KFTPTabWidget();
+
+ virtual void mousePressEvent( QMouseEvent* mouseEvent );
+
+ signals:
+ void mouseEvent( QString widgetName );
+
+};
+
+#endif
diff --git a/kftpgrabber/src/widgets/kftpzeroconflistview.cpp b/kftpgrabber/src/widgets/kftpzeroconflistview.cpp
new file mode 100644
index 0000000..eb60204
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpzeroconflistview.cpp
@@ -0,0 +1,98 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "kftpzeroconflistview.h"
+#include "kftpapi.h"
+#include "kftpsession.h"
+
+#include <kdeversion.h>
+
+#if KDE_IS_VERSION(3,4,0)
+#include "kftpzeroconf.h"
+#endif
+
+#include <klocale.h>
+#include <kiconloader.h>
+
+KFTPZeroConfListView::KFTPZeroConfListView(QWidget *parent, const char *name)
+ : KFTPWidgets::ListView(parent, name)
+{
+ // Set some stuff
+ setMinimumWidth(150);
+ setFullWidth(true);
+ addColumn(i18n("Sites Near You"));
+ setRootIsDecorated(true);
+ setEmptyListText(i18n("No sites published."));
+ setItemsRenameable(false);
+
+#if KDE_IS_VERSION(3,4,0)
+ connect(KFTPAPI::getInstance()->zeroConfInterface(), SIGNAL(servicesUpdated()), this, SLOT(slotSitesChanged()));
+ connect(this, SIGNAL(executed(QListViewItem*)), this, SLOT(slotSiteExecuted(QListViewItem*)));
+
+ slotSitesChanged();
+#endif
+}
+
+void KFTPZeroConfListView::slotSitesChanged()
+{
+#if KDE_IS_VERSION(3,4,0)
+ // Update the site list
+ QValueList<DNSSD::RemoteService::Ptr> list = KFTPAPI::getInstance()->zeroConfInterface()->getServiceList();
+
+ clear();
+ if (!list.isEmpty()) {
+ QValueList<DNSSD::RemoteService::Ptr>::iterator end(list.end());
+
+ for (QValueList<DNSSD::RemoteService::Ptr>::iterator i(list.begin()); i != end; ++i) {
+ QString name = (*i)->serviceName();
+ QString ip = (*i)->hostName();
+ QString port = QString::number((*i)->port());
+
+ KListViewItem *site = new KListViewItem(this, name, ip, port);
+ site->setPixmap(0, SmallIcon("lan"));
+ }
+ }
+#endif
+}
+
+void KFTPZeroConfListView::slotSiteExecuted(QListViewItem *item)
+{
+#if KDE_IS_VERSION(3,4,0)
+ // Connect to the site
+ KFTPAPI::getInstance()->mainWindow()->slotQuickConnect(item->text(0), item->text(1), item->text(2).toInt());
+#endif
+}
+
+#include "kftpzeroconflistview.moc"
diff --git a/kftpgrabber/src/widgets/kftpzeroconflistview.h b/kftpgrabber/src/widgets/kftpzeroconflistview.h
new file mode 100644
index 0000000..9aea9aa
--- /dev/null
+++ b/kftpgrabber/src/widgets/kftpzeroconflistview.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPZEROCONFLISTVIEW_H
+#define KFTPZEROCONFLISTVIEW_H
+
+#include "listview.h"
+
+/**
+ * This class provides a list view that displays all current FTP servers published via Zeroconf protocol.
+ *
+ * @author Jernej Kos
+ */
+class KFTPZeroConfListView : public KFTPWidgets::ListView
+{
+Q_OBJECT
+public:
+ KFTPZeroConfListView(QWidget *parent = 0, const char *name = 0);
+private slots:
+ void slotSitesChanged();
+ void slotSiteExecuted(QListViewItem*);
+};
+
+#endif
diff --git a/kftpgrabber/src/widgets/listview.cpp b/kftpgrabber/src/widgets/listview.cpp
new file mode 100644
index 0000000..635130b
--- /dev/null
+++ b/kftpgrabber/src/widgets/listview.cpp
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "listview.h"
+
+#include <qpainter.h>
+#include <qstringlist.h>
+
+namespace KFTPWidgets {
+
+ListView::ListView(QWidget *parent, const char *name)
+ : KListView(parent, name)
+{
+}
+
+
+ListView::~ListView()
+{
+}
+
+void ListView::resizeEvent(QResizeEvent *e)
+{
+ KListView::resizeEvent(e);
+ triggerUpdate();
+}
+
+void ListView::setEmptyListText(const QString &text)
+{
+ m_emptyListText = text;
+ triggerUpdate();
+}
+
+void ListView::drawContentsOffset(QPainter * p, int ox, int oy, int cx, int cy, int cw, int ch)
+{
+ KListView::drawContentsOffset(p, ox, oy, cx, cy, cw, ch);
+
+ if (childCount() == 0 && !m_emptyListText.isEmpty()) {
+ p->setPen(Qt::darkGray);
+
+ QStringList lines = QStringList::split("\n", m_emptyListText);
+ int ypos = 10 + p->fontMetrics().height();
+
+ QStringList::Iterator end(lines.end());
+ for (QStringList::Iterator str( lines.begin() ); str != end; ++str) {
+ p->drawText((viewport()->width()/2)-(p->fontMetrics().width(*str)/2), ypos, *str);
+ ypos += p->fontMetrics().lineSpacing();
+ }
+ }
+}
+
+}
+
+#include "listview.moc"
diff --git a/kftpgrabber/src/widgets/listview.h b/kftpgrabber/src/widgets/listview.h
new file mode 100644
index 0000000..8718f97
--- /dev/null
+++ b/kftpgrabber/src/widgets/listview.h
@@ -0,0 +1,63 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPLISTVIEW_H
+#define KFTPLISTVIEW_H
+
+#include <klistview.h>
+
+namespace KFTPWidgets {
+
+/**
+ * @author Jernej Kos
+ */
+class ListView : public KListView
+{
+Q_OBJECT
+public:
+ ListView(QWidget *parent = 0, const char *name = 0);
+ ~ListView();
+
+ void setEmptyListText(const QString &text);
+ virtual void resizeEvent(QResizeEvent *e);
+protected:
+ virtual void drawContentsOffset(QPainter * p, int ox, int oy, int cx, int cy, int cw, int ch );
+private:
+ QString m_emptyListText;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/listviewitem.cpp b/kftpgrabber/src/widgets/listviewitem.cpp
new file mode 100644
index 0000000..6b91feb
--- /dev/null
+++ b/kftpgrabber/src/widgets/listviewitem.cpp
@@ -0,0 +1,96 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "listviewitem.h"
+
+#include <qheader.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qsimplerichtext.h>
+
+namespace KFTPWidgets {
+
+ListViewItem::ListViewItem(QListView *parent)
+ : KListViewItem(parent)
+{
+}
+
+void ListViewItem::setRichText(int col, const QString &text)
+{
+ setText(col, QString::null);
+ m_richText[col] = text;
+}
+
+void ListViewItem::setup()
+{
+ QListViewItem::setup();
+
+ int maxHeight = height();
+
+ for (int i = 0; i < listView()->header()->count() - 1; i++) {
+ if (text(i).isNull()) {
+ QSimpleRichText rt(m_richText[i], QFont());
+ maxHeight = rt.height() > maxHeight ? rt.height() : maxHeight;
+ }
+ }
+
+ setHeight(maxHeight);
+}
+
+void ListViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
+{
+ if (text(column).isNull()) {
+ KListViewItem::paintCell(p, cg, column, width, alignment);
+ int pad = 0;
+
+ if (pixmap(column)) {
+ pad = pixmap(column)->width() + 5;
+ }
+
+ QSimpleRichText rt(m_richText[column], p->font());
+ rt.draw(p, pad, 0, QRect(pad, 0, width, height()), cg);
+ } else if (m_colors.contains(column)) {
+ QColorGroup _cg(cg);
+ QColor c = _cg.text();
+
+ _cg.setColor(QColorGroup::Text, m_colors[column]);
+ KListViewItem::paintCell(p, _cg, column, width, alignment);
+ _cg.setColor(QColorGroup::Text, c);
+ } else {
+ KListViewItem::paintCell(p, cg, column, width, alignment);
+ }
+}
+
+}
diff --git a/kftpgrabber/src/widgets/listviewitem.h b/kftpgrabber/src/widgets/listviewitem.h
new file mode 100644
index 0000000..b9edc23
--- /dev/null
+++ b/kftpgrabber/src/widgets/listviewitem.h
@@ -0,0 +1,71 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSLISTVIEWITEM_H
+#define KFTPWIDGETSLISTVIEWITEM_H
+
+#include <klistview.h>
+
+#include <qmap.h>
+#include <qcolor.h>
+
+namespace KFTPWidgets {
+
+/**
+ * This class is a simple QListViewItem replacement that supports displaying
+ * richtext.
+ *
+ * @author Jernej Kos
+ */
+class ListViewItem : public KListViewItem
+{
+public:
+ ListViewItem(QListView *parent);
+
+ void setRichText(int col, const QString &text);
+ QString richText(int col) { return m_richText[col]; }
+
+ void setTextColor(int col, QColor color) { m_colors[col] = color; }
+
+ void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment);
+ void setup();
+private:
+ QMap<int, QString> m_richText;
+ QMap<int, QColor> m_colors;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/logview.cpp b/kftpgrabber/src/widgets/logview.cpp
new file mode 100644
index 0000000..bac9df8
--- /dev/null
+++ b/kftpgrabber/src/widgets/logview.cpp
@@ -0,0 +1,143 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "logview.h"
+#include "misc/config.h"
+#include "kftpapi.h"
+
+#include <klocale.h>
+#include <kstdaction.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+
+#include <qfile.h>
+#include <qtextstream.h>
+
+namespace KFTPWidgets {
+
+LogView::LogView(QWidget *parent, const char *name)
+ : KTextEdit(parent, name)
+{
+ setTextFormat(Qt::LogText);
+ setMaxLogLines(200);
+ setFont(KFTPCore::Config::logFont());
+
+ // Override disabled background of KTextEdit
+ unsetPalette();
+
+ // Init actions
+ m_saveToFileAction = KStdAction::saveAs(this, SLOT(slotSaveToFile()), KFTPAPI::getInstance()->mainWindow()->actionCollection(), "log_safeAs");
+ m_clearLogAction = KStdAction::clear(this, SLOT(slotClearLog()), KFTPAPI::getInstance()->mainWindow()->actionCollection(), "log_clear");
+
+ append(i18n("<b>KFTPGrabber</b> logger initialized.<br>"));
+}
+
+
+LogView::~LogView()
+{
+}
+
+QPopupMenu *LogView::createPopupMenu(const QPoint &pos)
+{
+ QPopupMenu *menu = KTextEdit::createPopupMenu(pos);
+
+ m_saveToFileAction->plug(menu);
+ menu->insertSeparator();
+ m_clearLogAction->plug(menu);
+
+ return menu;
+}
+
+void LogView::slotSaveToFile()
+{
+ QString savePath = KFileDialog::getSaveFileName();
+
+ if (!savePath.isEmpty()) {
+ QFile file(savePath);
+ if (file.open(IO_WriteOnly)) {
+ QTextStream stream(&file);
+ stream << text();
+ file.close();
+ } else {
+ KMessageBox::error(0L, i18n("Unable to open file for writing."));
+ }
+ }
+}
+
+void LogView::slotClearLog()
+{
+ clear();
+}
+
+void LogView::append(const QString &text)
+{
+ QDateTime dt = QDateTime::currentDateTime();
+ QTextEdit::append("[" + dt.toString("hh:mm:ss") + "] " + text);
+ scrollToBottom();
+}
+
+void LogView::ftpLog(int type, const QString &text)
+{
+ // Set the font if changed
+ if (KFTPCore::Config::logFont() != font())
+ setFont(KFTPCore::Config::logFont());
+
+ QString line;
+ line = text.stripWhiteSpace();
+ line.replace("<", "&lt;");
+ line.replace(">", "&gt;");
+ switch (type) {
+ case 0: {
+ QString code = line.section(" ", 0, 0);
+ QString text = line.mid(line.find(' ')+1);
+ append("<font color=" + KFTPCore::Config::logResponsesColor().name() + "><b>" + code + "</b> " + text + "</font><br>");
+ break;
+ }
+ case 1: {
+ if (line.left(4) == "PASS")
+ line = "PASS (hidden)";
+
+ append("<font color=" + KFTPCore::Config::logCommandsColor().name() + "><b>" + line + "</b></font><br>");
+ break;
+ }
+ case 2: append("<font color=" + KFTPCore::Config::logMultilineColor().name() + ">" + line + "</font><br>"); break;
+ case 3: append("<font color=" + KFTPCore::Config::logStatusColor().name() + "><b>*** " + line + "</b></font><br>"); break;
+ case 4: append("<font color=" + KFTPCore::Config::logErrorColor().name() + "><b>*** " + line + "</b></font><br>"); break;
+ }
+}
+
+}
+
+#include "logview.moc"
diff --git a/kftpgrabber/src/widgets/logview.h b/kftpgrabber/src/widgets/logview.h
new file mode 100644
index 0000000..ac2f9e3
--- /dev/null
+++ b/kftpgrabber/src/widgets/logview.h
@@ -0,0 +1,73 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPLOGVIEW_H
+#define KFTPLOGVIEW_H
+
+#include <ktextedit.h>
+#include <kaction.h>
+
+#include <qpopupmenu.h>
+
+namespace KFTPWidgets {
+
+/**
+ * This class provides a simple log widget.
+ *
+ * @author Jernej Kos
+ */
+class LogView : public KTextEdit
+{
+Q_OBJECT
+public:
+ LogView(QWidget *parent = 0, const char *name = 0);
+ ~LogView();
+
+ void append(const QString &text);
+protected:
+ KAction *m_saveToFileAction;
+ KAction *m_clearLogAction;
+
+ QPopupMenu *createPopupMenu(const QPoint &pos);
+public slots:
+ void ftpLog(int type, const QString &text);
+private slots:
+ void slotSaveToFile();
+ void slotClearLog();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/multitabbar.cpp b/kftpgrabber/src/widgets/multitabbar.cpp
new file mode 100644
index 0000000..2b7c583
--- /dev/null
+++ b/kftpgrabber/src/widgets/multitabbar.cpp
@@ -0,0 +1,1160 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2001-2003 by Joseph Wenninger <jowenn@kde.org>
+ * Copyright (C) 2005 by Mark Kretschmann <markey@web.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "multitabbar.h"
+#include "multitabbar.moc"
+#include "multitabbar_p.h"
+#include "multitabbar_p.moc"
+
+#include <math.h>
+
+#include <qapplication.h>
+#include <qbutton.h>
+#include <qpopupmenu.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qfontmetrics.h>
+#include <qstyle.h>
+#include <qtimer.h>
+
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kstringhandler.h>
+
+#define NEARBYINT(i) ((int(float(i) + 0.5)))
+
+namespace KFTPWidgets {
+
+class MultiTabBarTabPrivate
+{
+public:
+ QPixmap pix;
+};
+
+
+MultiTabBarInternal::MultiTabBarInternal( QWidget *parent, MultiTabBar::MultiTabBarMode bm ) : QScrollView( parent )
+{
+ m_expandedTabSize = -1;
+ m_showActiveTabTexts = false;
+ m_tabs.setAutoDelete( true );
+ m_barMode = bm;
+ setHScrollBarMode( AlwaysOff );
+ setVScrollBarMode( AlwaysOff );
+ if ( bm == MultiTabBar::Vertical ) {
+ box = new QWidget( viewport() );
+ mainLayout = new QVBoxLayout( box );
+ mainLayout->setAutoAdd( true );
+ box->setFixedWidth( 24 );
+ setFixedWidth( 24 );
+ } else {
+ box = new QWidget( viewport() );
+ mainLayout = new QHBoxLayout( box );
+ mainLayout->setAutoAdd( true );
+ box->setFixedHeight( 24 );
+ setFixedHeight( 24 );
+ }
+ addChild( box );
+ setFrameStyle( NoFrame );
+ viewport() ->setBackgroundMode( Qt::PaletteBackground );
+ /* box->setPaletteBackgroundColor(Qt::red);
+ setPaletteBackgroundColor(Qt::green);*/
+}
+
+void MultiTabBarInternal::setStyle( enum MultiTabBar::MultiTabBarStyle style )
+{
+ m_style = style;
+ for ( uint i = 0;i < m_tabs.count();i++ )
+ m_tabs.at( i ) ->setStyle( m_style );
+
+ if ( ( m_style == MultiTabBar::KDEV3 ) ||
+ ( m_style == MultiTabBar::KDEV3ICON ) ||
+ ( m_style == MultiTabBar::AMAROK ) ) {
+ delete mainLayout;
+ mainLayout = 0;
+ resizeEvent( 0 );
+ } else if ( mainLayout == 0 ) {
+ if ( m_barMode == MultiTabBar::Vertical ) {
+ box = new QWidget( viewport() );
+ mainLayout = new QVBoxLayout( box );
+ box->setFixedWidth( 24 );
+ setFixedWidth( 24 );
+ } else {
+ box = new QWidget( viewport() );
+ mainLayout = new QHBoxLayout( box );
+ box->setFixedHeight( 24 );
+ setFixedHeight( 24 );
+ }
+ addChild( box );
+ for ( uint i = 0;i < m_tabs.count();i++ )
+ mainLayout->add( m_tabs.at( i ) );
+ mainLayout->setAutoAdd( true );
+
+ }
+ viewport() ->repaint();
+}
+
+void MultiTabBarInternal::drawContents ( QPainter * paint, int clipx, int clipy, int clipw, int cliph )
+{
+ QScrollView::drawContents ( paint , clipx, clipy, clipw, cliph );
+
+ if ( m_position == MultiTabBar::Right ) {
+
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 0, 0, viewport() ->height() );
+ paint->setPen( colorGroup().background().dark( 120 ) );
+ paint->drawLine( 1, 0, 1, viewport() ->height() );
+
+
+ } else
+ if ( m_position == MultiTabBar::Left ) {
+ paint->setPen( colorGroup().light() );
+ paint->drawLine( 23, 0, 23, viewport() ->height() );
+ paint->drawLine( 22, 0, 22, viewport() ->height() );
+
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 0, 0, viewport() ->height() );
+ } else
+ if ( m_position == MultiTabBar::Bottom ) {
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 0, viewport() ->width(), 0 );
+ paint->setPen( colorGroup().background().dark( 120 ) );
+ paint->drawLine( 0, 1, viewport() ->width(), 1 );
+ } else {
+ paint->setPen( colorGroup().light() );
+ paint->drawLine( 0, 23, viewport() ->width(), 23 );
+ paint->drawLine( 0, 22, viewport() ->width(), 22 );
+
+ /* paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,0,viewport()->height());*/
+
+ }
+
+
+}
+
+void MultiTabBarInternal::contentsMousePressEvent( QMouseEvent *ev )
+{
+ ev->ignore();
+}
+
+void MultiTabBarInternal::mousePressEvent( QMouseEvent *ev )
+{
+ ev->ignore();
+}
+
+
+#define CALCDIFF(m_tabs,diff,i) if (m_lines>(int)lines) {\
+ /*kdDebug()<<"i="<<i<<" tabCount="<<tabCount<<" space="<<space<<endl;*/ \
+ uint ulen=0;\
+ diff=0; \
+ for (uint i2=i;i2<tabCount;i2++) {\
+ uint l1=m_tabs.at(i2)->neededSize();\
+ if ((ulen+l1)>space){\
+ if (ulen==0) diff=0;\
+ else diff=((float)(space-ulen))/(i2-i);\
+ break;\
+ }\
+ ulen+=l1;\
+ }\
+ } else {diff=0; }
+
+
+void MultiTabBarInternal::resizeEvent( QResizeEvent *ev )
+{
+ /* kdDebug()<<"MultiTabBarInternal::resizeEvent"<<endl;
+ kdDebug()<<"MultiTabBarInternal::resizeEvent - box geometry"<<box->geometry()<<endl;
+ kdDebug()<<"MultiTabBarInternal::resizeEvent - geometry"<<geometry()<<endl;*/
+ if ( ev ) QScrollView::resizeEvent( ev );
+
+ if ( ( m_style == MultiTabBar::KDEV3 ) ||
+ ( m_style == MultiTabBar::KDEV3ICON ) ||
+ ( m_style == MultiTabBar::AMAROK ) ) {
+ box->setGeometry( 0, 0, width(), height() );
+ int lines = 1;
+ uint space;
+ float tmp = 0;
+ if ( ( m_position == MultiTabBar::Bottom ) || ( m_position == MultiTabBar::Top ) )
+ space = width();
+ else
+ space = height();
+
+ int cnt = 0;
+ //CALCULATE LINES
+ const uint tabCount = m_tabs.count();
+ for ( uint i = 0;i < tabCount;i++ ) {
+ cnt++;
+ tmp += m_tabs.at( i ) ->neededSize();
+ if ( tmp > space ) {
+ if ( cnt > 1 ) i--;
+ else if ( i == ( tabCount - 1 ) ) break;
+ cnt = 0;
+ tmp = 0;
+ lines++;
+ }
+ }
+ //SET SIZE & PLACE
+ float diff = 0;
+ cnt = 0;
+
+ if ( ( m_position == MultiTabBar::Bottom ) || ( m_position == MultiTabBar::Top ) ) {
+
+ setFixedHeight( lines * 24 );
+ box->setFixedHeight( lines * 24 );
+ m_lines = height() / 24 - 1;
+ lines = 0;
+ CALCDIFF( m_tabs, diff, 0 )
+ tmp = -diff;
+
+ //kdDebug()<<"m_lines recalculated="<<m_lines<<endl;
+ for ( uint i = 0;i < tabCount;i++ ) {
+ MultiTabBarTab *tab = m_tabs.at( i );
+ cnt++;
+ tmp += tab->neededSize() + diff;
+ if ( tmp > space ) {
+ //kdDebug()<<"about to start new line"<<endl;
+ if ( cnt > 1 ) {
+ CALCDIFF( m_tabs, diff, i )
+ i--;
+ } else {
+ //kdDebug()<<"placing line on old line"<<endl;
+ kdDebug() << "diff=" << diff << endl;
+ tab->removeEventFilter( this );
+ tab->move( NEARBYINT( tmp - tab->neededSize() ), lines * 24 );
+ // tab->setFixedWidth(tab->neededSize()+diff);
+ tab->setFixedWidth( NEARBYINT( tmp + diff ) - tab->x() );;
+ tab->installEventFilter( this );
+ CALCDIFF( m_tabs, diff, ( i + 1 ) )
+
+ }
+ tmp = -diff;
+ cnt = 0;
+ lines++;
+ //kdDebug()<<"starting new line:"<<lines<<endl;
+
+ } else {
+ //kdDebug()<<"Placing line on line:"<<lines<<" pos: (x/y)=("<<tmp-m_tabs.at(i)->neededSize()<<"/"<<lines*24<<")"<<endl;
+ //kdDebug()<<"diff="<<diff<<endl;
+ tab->removeEventFilter( this );
+ tab->move( NEARBYINT( tmp - tab->neededSize() ), lines * 24 );
+ tab->setFixedWidth( NEARBYINT( tmp + diff ) - tab->x() );;
+
+ //tab->setFixedWidth(tab->neededSize()+diff);
+ tab->installEventFilter( this );
+
+ }
+ }
+ } else {
+ setFixedWidth( lines * 24 );
+ box->setFixedWidth( lines * 24 );
+ m_lines = lines = width() / 24;
+ lines = 0;
+ CALCDIFF( m_tabs, diff, 0 )
+ tmp = -diff;
+
+ for ( uint i = 0;i < tabCount;i++ ) {
+ MultiTabBarTab *tab = m_tabs.at( i );
+ cnt++;
+ tmp += tab->neededSize() + diff;
+ if ( tmp > space ) {
+ if ( cnt > 1 ) {
+ CALCDIFF( m_tabs, diff, i );
+ tmp = -diff;
+ i--;
+ } else {
+ tab->removeEventFilter( this );
+ tab->move( lines * 24, NEARBYINT( tmp - tab->neededSize() ) );
+ tab->setFixedHeight( NEARBYINT( tmp + diff ) - tab->y() );;
+ tab->installEventFilter( this );
+ }
+ cnt = 0;
+ tmp = -diff;
+ lines++;
+ } else {
+ tab->removeEventFilter( this );
+ tab->move( lines * 24, NEARBYINT( tmp - tab->neededSize() ) );
+ tab->setFixedHeight( NEARBYINT( tmp + diff ) - tab->y() );;
+ tab->installEventFilter( this );
+ }
+ }
+ }
+
+
+ //kdDebug()<<"needed lines:"<<m_lines<<endl;
+ } else {
+ int size = 0; /*move the calculation into another function and call it only on add tab and tab click events*/
+ for ( int i = 0;i < ( int ) m_tabs.count();i++ )
+ size += ( m_barMode == MultiTabBar::Vertical ? m_tabs.at( i ) ->height() : m_tabs.at( i ) ->width() );
+ if ( ( m_position == MultiTabBar::Bottom ) || ( m_position == MultiTabBar::Top ) )
+ box->setGeometry( 0, 0, size, height() );
+ else box->setGeometry( 0, 0, width(), size );
+
+ }
+}
+
+
+void MultiTabBarInternal::showActiveTabTexts( bool show )
+{
+ m_showActiveTabTexts = show;
+}
+
+
+MultiTabBarTab* MultiTabBarInternal::tab( int id ) const
+{
+ for ( QPtrListIterator<MultiTabBarTab> it( m_tabs );it.current();++it ) {
+ if ( it.current() ->id() == id ) return it.current();
+ }
+ return 0;
+}
+
+bool MultiTabBarInternal::eventFilter( QObject *, QEvent *e )
+{
+ if ( e->type() == QEvent::Resize )
+ resizeEvent( 0 );
+
+ //PATCH by markey: Allow switching of tabs with mouse wheel
+ if ( e->type() == QEvent::Wheel ) {
+ QWheelEvent* event = static_cast<QWheelEvent*>( e );
+ const int delta = event->delta() / 120;
+
+ // Determine which tab is currently active
+ uint i;
+ for( i = 0; i < m_tabs.count(); i++ )
+ if ( m_tabs.at( i )->isOn() ) break;
+
+ // Calculate index of the new tab to activate
+ int newTab = i - delta;
+ if ( newTab < 0 ) newTab = 0;
+ if ( newTab > (int)m_tabs.count() - 1 ) newTab = m_tabs.count() - 1;
+
+ if ( i < m_tabs.count() && newTab != (int)i )
+ m_tabs.at( newTab )->animateClick();
+
+ // Must return true here for the wheel to work properly
+ return true;
+ }
+
+ return false;
+}
+
+int MultiTabBarInternal::appendTab(const QPixmap &pic , int id, const QString &text)
+{
+ MultiTabBarTab *tab;
+
+ m_tabs.append(tab = new MultiTabBarTab(this, pic, text, id, box, m_position, m_style));
+ tab->installEventFilter(this);
+ tab->showActiveTabText(m_showActiveTabTexts);
+
+ if (m_style == MultiTabBar::KONQSBC) {
+ if (m_expandedTabSize < tab->neededSize()) {
+ m_expandedTabSize = tab->neededSize();
+
+ for (uint i = 0; i < m_tabs.count(); i++)
+ m_tabs.at(i)->setSize(m_expandedTabSize);
+ } else {
+ tab->setSize(m_expandedTabSize);
+ }
+ } else {
+ tab->updateState();
+ }
+
+ tab->show();
+ resizeEvent(0);
+
+ return 0;
+}
+
+void MultiTabBarInternal::removeTab( int id )
+{
+ for ( uint pos = 0;pos < m_tabs.count();pos++ ) {
+ if ( m_tabs.at( pos ) ->id() == id ) {
+ m_tabs.remove( pos );
+ resizeEvent( 0 );
+ break;
+ }
+ }
+}
+
+void MultiTabBarInternal::setPosition( enum MultiTabBar::MultiTabBarPosition pos )
+{
+ m_position = pos;
+ for ( uint i = 0;i < m_tabs.count();i++ )
+ m_tabs.at( i ) ->setTabsPosition( m_position );
+ viewport() ->repaint();
+}
+
+
+MultiTabBarButton::MultiTabBarButton(MultiTabBarInternal *tb, const QPixmap& pic, const QString& text, QPopupMenu *popup,
+ int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style )
+ : QPushButton(QIconSet(), text, parent),
+ m_tb(tb),
+ m_style(style),
+ m_animCount(0),
+ m_animTimer(new QTimer(this))
+{
+ setIconSet(pic);
+ setText(text);
+
+ m_position = pos;
+
+ if (popup)
+ setPopup( popup );
+
+ setFlat(true);
+ setFixedHeight(24);
+ setFixedWidth(24);
+ m_id = id;
+
+ connect(this, SIGNAL(clicked()), this, SLOT(slotClicked()));
+ connect(m_animTimer, SIGNAL(timeout()), this, SLOT(slotAnimTimer()));
+}
+
+MultiTabBarButton::MultiTabBarButton(MultiTabBarInternal *tb, const QString& text, QPopupMenu *popup,
+ int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style )
+ : QPushButton(QIconSet(), text, parent),
+ m_tb(tb),
+ m_style(style),
+ m_animCount(0),
+ m_animTimer(new QTimer(this))
+{
+ setText(text);
+ m_position = pos;
+
+ if (popup)
+ setPopup(popup);
+
+ setFlat(true);
+ setFixedHeight(24);
+ setFixedWidth(24);
+ m_id = id;
+
+ connect(this, SIGNAL(clicked()), this, SLOT(slotClicked()));
+ connect(m_animTimer, SIGNAL(timeout()), this, SLOT(slotAnimTimer()));
+}
+
+MultiTabBarButton::~MultiTabBarButton()
+{}
+
+int MultiTabBarButton::id() const
+{
+ return m_id;
+}
+
+void MultiTabBarButton::setText(const QString& text)
+{
+ QPushButton::setText(text);
+ m_text = text;
+}
+
+void MultiTabBarButton::slotClicked()
+{
+ emit clicked(m_id);
+}
+
+void MultiTabBarButton::setPosition(MultiTabBar::MultiTabBarPosition pos)
+{
+ m_position = pos;
+ repaint();
+}
+
+void MultiTabBarButton::setStyle(MultiTabBar::MultiTabBarStyle style)
+{
+ m_style = style;
+ repaint();
+}
+
+void MultiTabBarButton::hideEvent(QHideEvent* he)
+{
+ QPushButton::hideEvent(he);
+
+ MultiTabBar *tb = dynamic_cast<MultiTabBar*>(parentWidget());
+ if (tb)
+ tb->updateSeparator();
+}
+
+void MultiTabBarButton::showEvent(QShowEvent* he)
+{
+ QPushButton::showEvent(he);
+
+ MultiTabBar *tb = dynamic_cast<MultiTabBar*>(parentWidget());
+ if (tb)
+ tb->updateSeparator();
+}
+
+void MultiTabBarButton::enterEvent(QEvent*)
+{
+ m_animEnter = true;
+ m_animCount = 0;
+
+ m_animTimer->start(ANIM_INTERVAL);
+}
+
+void MultiTabBarButton::leaveEvent(QEvent*)
+{
+ if (m_animCount == 0)
+ m_animCount = 1;
+
+ m_animEnter = false;
+ m_animTimer->start(ANIM_INTERVAL);
+}
+
+void MultiTabBarButton::slotAnimTimer()
+{
+ if (m_animEnter) {
+ m_animCount += 1;
+ repaint(false);
+
+ if (m_animCount >= ANIM_MAX)
+ m_animTimer->stop();
+ } else {
+ m_animCount -= 1;
+ repaint(false);
+
+ if (m_animCount <= 0)
+ m_animTimer->stop();
+ }
+}
+
+QSize MultiTabBarButton::sizeHint() const
+{
+ constPolish();
+
+ int w = 0, h = 0;
+
+ // calculate contents size...
+#ifndef QT_NO_ICONSET
+ if ( iconSet() && !iconSet() ->isNull() ) {
+ 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 );
+ }
+#endif
+ if ( isMenuButton() )
+ w += style().pixelMetric( QStyle::PM_MenuButtonIndicator, this );
+
+ if ( pixmap() ) {
+ QPixmap * pm = ( QPixmap * ) pixmap();
+ w += pm->width();
+ h += pm->height();
+ } else {
+ 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() );
+ }
+
+ //PATCH by markey
+ if ((m_style == MultiTabBar::AMAROK)) {
+ if (m_position == MultiTabBar::Bottom)
+ w = (parentWidget()->width() - 3) / m_tb->tabs()->count();
+ else
+ h = (parentWidget()->height() - 3) / m_tb->tabs()->count();
+ }
+
+ return ( style().sizeFromContents( QStyle::CT_ToolButton, this, QSize( w, h ) ).
+ expandedTo( QApplication::globalStrut() ) );
+}
+
+
+MultiTabBarTab::MultiTabBarTab( MultiTabBarInternal *tb, const QPixmap& pic, const QString& text,
+ int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos,
+ MultiTabBar::MultiTabBarStyle style )
+ : MultiTabBarButton(tb, text, 0, id, parent, pos, style),
+ m_showActiveTabText(false)
+{
+ d = new MultiTabBarTabPrivate();
+ setIcon( pic );
+ m_expandedSize = 24;
+ setToggleButton( true );
+
+ // Prevent flicker on redraw
+ setWFlags( getWFlags() | Qt::WNoAutoErase );
+}
+
+MultiTabBarTab::~MultiTabBarTab()
+{
+ delete d;
+}
+
+
+void MultiTabBarTab::setTabsPosition( MultiTabBar::MultiTabBarPosition pos )
+{
+ if ( ( pos != m_position ) && ( ( pos == MultiTabBar::Left ) || ( pos == MultiTabBar::Right ) ) ) {
+ if ( !d->pix.isNull() ) {
+ QWMatrix temp; // (1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F);
+ temp.rotate( 180 );
+ d->pix = d->pix.xForm( temp );
+ setIconSet( d->pix );
+ }
+ }
+
+ setPosition( pos );
+ // repaint();
+}
+
+void MultiTabBarTab::setIcon( const QString& icon )
+{
+ QPixmap pic = SmallIcon( icon );
+ setIcon( pic );
+}
+
+void MultiTabBarTab::setIcon( const QPixmap& icon )
+{
+
+ if ( m_style != MultiTabBar::KDEV3 ) {
+ if ( ( m_position == MultiTabBar::Left ) || ( m_position == MultiTabBar::Right ) ) {
+ QWMatrix rotateMatrix;
+ if ( m_position == MultiTabBar::Left )
+ rotateMatrix.rotate( 90 );
+ else
+ rotateMatrix.rotate( -90 );
+ QPixmap pic = icon.xForm( rotateMatrix ); //TODO FIX THIS, THIS SHOWS WINDOW
+ d->pix = pic;
+ setIconSet( pic );
+ } else setIconSet( icon );
+ }
+}
+
+void MultiTabBarTab::slotClicked()
+{
+ if (m_animTimer->isActive()) {
+ m_animCount = ANIM_MAX;
+ m_animTimer->stop();
+ repaint();
+ }
+
+ updateState();
+ MultiTabBarButton::slotClicked();
+}
+
+void MultiTabBarTab::setState(bool b)
+{
+ setOn(b);
+ updateState();
+}
+
+void MultiTabBarTab::updateState()
+{
+
+ if ( m_style != MultiTabBar::KONQSBC ) {
+ if ( ( m_style == MultiTabBar::KDEV3 ) || ( m_style == MultiTabBar::KDEV3ICON ) || ( m_style == MultiTabBar::AMAROK ) || ( isOn() ) ) {
+ QPushButton::setText( m_text );
+ } else {
+ kdDebug() << "MultiTabBarTab::updateState(): setting text to an empty QString***************" << endl;
+ QPushButton::setText( QString::null );
+ }
+
+ if ( ( m_position == MultiTabBar::Right || m_position == MultiTabBar::Left ) ) {
+ setFixedWidth( 24 );
+ if ( ( m_style == MultiTabBar::KDEV3 ) || ( m_style == MultiTabBar::KDEV3ICON ) || ( m_style == MultiTabBar::AMAROK ) || ( isOn() ) ) {
+ setFixedHeight( MultiTabBarButton::sizeHint().width() );
+ } else setFixedHeight( 36 );
+ } else {
+ setFixedHeight( 24 );
+ if ( ( m_style == MultiTabBar::KDEV3 ) || ( m_style == MultiTabBar::KDEV3ICON ) || ( m_style == MultiTabBar::AMAROK ) || ( isOn() ) ) {
+ setFixedWidth( MultiTabBarButton::sizeHint().width() );
+ } else setFixedWidth( 36 );
+ }
+ } else {
+ if ( ( !isOn() ) || ( !m_showActiveTabText ) ) {
+ setFixedWidth( 24 );
+ setFixedHeight( 24 );
+ return ;
+ }
+ if ( ( m_position == MultiTabBar::Right || m_position == MultiTabBar::Left ) )
+ setFixedHeight( m_expandedSize );
+ else
+ setFixedWidth( m_expandedSize );
+ }
+ QApplication::sendPostedEvents( 0, QEvent::Paint | QEvent::Move | QEvent::Resize | QEvent::LayoutHint );
+ QApplication::flush();
+}
+
+int MultiTabBarTab::neededSize()
+{
+ if (m_style == MultiTabBar::AMAROK) {
+ if (m_position == MultiTabBar::Left)
+ return (parentWidget()->height() - 3) / m_tb->tabs()->count();
+ else
+ return (parentWidget()->width() - 3) / m_tb->tabs()->count();
+ } else {
+ return (((m_style != MultiTabBar::KDEV3 ) ? 24 : 0) + QFontMetrics(QFont()).width(m_text) + 6);
+ }
+}
+
+void MultiTabBarTab::setSize( int size )
+{
+ m_expandedSize = size;
+ updateState();
+}
+
+void MultiTabBarTab::showActiveTabText(bool show)
+{
+ m_showActiveTabText = show;
+}
+
+void MultiTabBarTab::drawButtonLabel(QPainter *p)
+{
+ drawButton(p);
+}
+void MultiTabBarTab::drawButton(QPainter *paint)
+{
+ if (m_style == MultiTabBar::AMAROK) {
+ drawButtonAmarok(paint);
+ } else if (m_style != MultiTabBar::KONQSBC) {
+ drawButtonStyled(paint);
+ } else {
+ drawButtonClassic(paint);
+ }
+}
+
+void MultiTabBarTab::drawButtonStyled( QPainter *paint )
+{
+
+ QSize sh;
+ const int width = 36; // rotated
+ const int height = 24;
+ if ( ( m_style == MultiTabBar::KDEV3 ) || ( m_style == MultiTabBar::KDEV3ICON ) || ( m_style == MultiTabBar::AMAROK ) || ( isOn() ) ) {
+ if ( ( m_position == MultiTabBar::Left ) || ( m_position == MultiTabBar::Right ) )
+ sh = QSize( this->height(), this->width() ); //MultiTabBarButton::sizeHint();
+ else sh = QSize( this->width(), this->height() );
+ } else
+ sh = QSize( width, height );
+
+ QPixmap pixmap( sh.width(), height ); ///,sh.height());
+ pixmap.fill( eraseColor() );
+ QPainter painter( &pixmap );
+
+
+ QStyle::SFlags st = QStyle::Style_Default;
+
+ st |= QStyle::Style_Enabled;
+
+ if ( isOn() ) st |= QStyle::Style_On;
+
+ style().drawControl( QStyle::CE_PushButton, &painter, this, QRect( 0, 0, pixmap.width(), pixmap.height() ), colorGroup(), st );
+ style().drawControl( QStyle::CE_PushButtonLabel, &painter, this, QRect( 0, 0, pixmap.width(), pixmap.height() ), colorGroup(), st );
+
+ switch ( m_position ) {
+ case MultiTabBar::Left:
+ paint->rotate( -90 );
+ paint->drawPixmap( 1 - pixmap.width(), 0, pixmap );
+ break;
+ case MultiTabBar::Right:
+ paint->rotate( 90 );
+ paint->drawPixmap( 0, 1 - pixmap.height(), pixmap );
+ break;
+
+ default:
+ paint->drawPixmap( 0, 0, pixmap );
+ break;
+ }
+ // style().drawControl(QStyle::CE_PushButtonLabel,painter,this, QRect(0,0,pixmap.width(),pixmap.height()),
+ // colorGroup(),QStyle::Style_Enabled);
+
+
+}
+
+void MultiTabBarTab::drawButtonClassic( QPainter *paint )
+{
+ QPixmap pixmap;
+ if ( iconSet() )
+ pixmap = iconSet() ->pixmap( QIconSet::Small, QIconSet::Normal );
+ paint->fillRect( 0, 0, 24, 24, colorGroup().background() );
+
+ if ( !isOn() ) {
+
+ if ( m_position == MultiTabBar::Right ) {
+ paint->fillRect( 0, 0, 21, 21, QBrush( colorGroup().background() ) );
+
+ paint->setPen( colorGroup().background().dark( 150 ) );
+ paint->drawLine( 0, 22, 23, 22 );
+
+ paint->drawPixmap( 12 - pixmap.width() / 2, 12 - pixmap.height() / 2, pixmap );
+
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 0, 0, 23 );
+ paint->setPen( colorGroup().background().dark( 120 ) );
+ paint->drawLine( 1, 0, 1, 23 );
+
+ } else
+ if ( ( m_position == MultiTabBar::Bottom ) || ( m_position == MultiTabBar::Top ) ) {
+ paint->fillRect( 0, 1, 23, 22, QBrush( colorGroup().background() ) );
+
+ paint->drawPixmap( 12 - pixmap.width() / 2, 12 - pixmap.height() / 2, pixmap );
+
+ paint->setPen( colorGroup().background().dark( 120 ) );
+ paint->drawLine( 23, 0, 23, 23 );
+
+
+ paint->setPen( colorGroup().light() );
+ paint->drawLine( 0, 22, 23, 22 );
+ paint->drawLine( 0, 23, 23, 23 );
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 0, 23, 0 );
+ paint->setPen( colorGroup().background().dark( 120 ) );
+ paint->drawLine( 0, 1, 23, 1 );
+
+ } else {
+ paint->setPen( colorGroup().background().dark( 120 ) );
+ paint->drawLine( 0, 23, 23, 23 );
+ paint->fillRect( 0, 0, 23, 21, QBrush( colorGroup().background() ) );
+ paint->drawPixmap( 12 - pixmap.width() / 2, 12 - pixmap.height() / 2, pixmap );
+
+ paint->setPen( colorGroup().light() );
+ paint->drawLine( 23, 0, 23, 23 );
+ paint->drawLine( 22, 0, 22, 23 );
+
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 0, 0, 23 );
+
+ }
+
+
+ } else {
+ if ( m_position == MultiTabBar::Right ) {
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, height() - 1, 23, height() - 1 );
+ paint->drawLine( 0, height() - 2, 23, height() - 2 );
+ paint->drawLine( 23, 0, 23, height() - 1 );
+ paint->drawLine( 22, 0, 22, height() - 1 );
+ paint->fillRect( 0, 0, 21, height() - 3, QBrush( colorGroup().light() ) );
+ paint->drawPixmap( 10 - pixmap.width() / 2, 10 - pixmap.height() / 2, pixmap );
+
+ if ( m_showActiveTabText ) {
+ if ( height() < 25 + 4 ) return ;
+
+ QPixmap tpixmap( height() - 25 - 3, width() - 2 );
+ QPainter painter( &tpixmap );
+
+ painter.fillRect( 0, 0, tpixmap.width(), tpixmap.height(), QBrush( colorGroup().light() ) );
+
+ painter.setPen( colorGroup().text() );
+ painter.drawText( 0, + width() / 2 + QFontMetrics( QFont() ).height() / 2, m_text );
+
+ paint->rotate( 90 );
+ kdDebug() << "tpixmap.width:" << tpixmap.width() << endl;
+ paint->drawPixmap( 25, -tpixmap.height() + 1, tpixmap );
+ }
+
+ } else
+ if ( m_position == MultiTabBar::Top ) {
+ paint->fillRect( 0, 0, width() - 1, 23, QBrush( colorGroup().light() ) );
+ paint->drawPixmap( 10 - pixmap.width() / 2, 10 - pixmap.height() / 2, pixmap );
+ if ( m_showActiveTabText ) {
+ paint->setPen( colorGroup().text() );
+ paint->drawText( 25, height() / 2 + QFontMetrics( QFont() ).height() / 2, m_text );
+ }
+ } else
+ if ( m_position == MultiTabBar::Bottom ) {
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, 23, width() - 1, 23 );
+ paint->drawLine( 0, 22, width() - 1, 22 );
+ paint->fillRect( 0, 0, width() - 1, 21, QBrush( colorGroup().light() ) );
+ paint->drawPixmap( 10 - pixmap.width() / 2, 10 - pixmap.height() / 2, pixmap );
+ if ( m_showActiveTabText ) {
+ paint->setPen( colorGroup().text() );
+ paint->drawText( 25, height() / 2 + QFontMetrics( QFont() ).height() / 2, m_text );
+ }
+
+ } else {
+
+
+ paint->setPen( colorGroup().shadow() );
+ paint->drawLine( 0, height() - 1, 23, height() - 1 );
+ paint->drawLine( 0, height() - 2, 23, height() - 2 );
+ paint->fillRect( 0, 0, 23, height() - 3, QBrush( colorGroup().light() ) );
+ paint->drawPixmap( 10 - pixmap.width() / 2, 10 - pixmap.height() / 2, pixmap );
+ if ( m_showActiveTabText ) {
+
+ if ( height() < 25 + 4 ) return ;
+
+ QPixmap tpixmap( height() - 25 - 3, width() - 2 );
+ QPainter painter( &tpixmap );
+
+ painter.fillRect( 0, 0, tpixmap.width(), tpixmap.height(), QBrush( colorGroup().light() ) );
+
+ painter.setPen( colorGroup().text() );
+ painter.drawText( tpixmap.width() - QFontMetrics( QFont() ).width( m_text ), + width() / 2 + QFontMetrics( QFont() ).height() / 2, m_text );
+
+ paint->rotate( -90 );
+ kdDebug() << "tpixmap.width:" << tpixmap.width() << endl;
+
+ paint->drawPixmap( -24 - tpixmap.width(), 2, tpixmap );
+
+ }
+
+ }
+
+ }
+}
+
+void MultiTabBarTab::drawButtonAmarok(QPainter *paint)
+{
+ QColor fillColor, textColor;
+
+ if (isOn()) {
+ fillColor = blendColors(colorGroup().highlight(), colorGroup().background(), static_cast<int>(m_animCount * 3.5));
+ textColor = blendColors(colorGroup().highlightedText(), colorGroup().text(), static_cast<int>(m_animCount * 4.5));
+ } else {
+ fillColor = blendColors(colorGroup().background(), colorGroup().highlight(), static_cast<int>(m_animCount * 3.5));
+ textColor = blendColors(colorGroup().text(), colorGroup().highlightedText(), static_cast<int>(m_animCount * 4.5));
+ }
+
+ const QPixmap icon = iconSet()->pixmap(QIconSet::Small, QIconSet::Normal);
+
+ // Our pixmap
+ QPixmap pixmap;
+
+ if (m_position == MultiTabBar::Left)
+ pixmap.resize(height(), width());
+ else
+ pixmap.resize(width(), height());
+
+ pixmap.fill(fillColor);
+ QPainter painter(&pixmap);
+
+ // Draw the frame
+ painter.setPen(colorGroup().mid());
+ if (m_id != m_tb->tabs()->count() - 1)
+ painter.drawLine(0, 0, 0, pixmap.height() - 1);
+ painter.drawLine(0, pixmap.height() - 1, pixmap.width() - 1, pixmap.height() - 1);
+
+ // Draw the text
+ QFont font;
+ font.setBold(isOn());
+ painter.setFont(font);
+ QString text = KStringHandler::rPixelSqueeze(m_text, QFontMetrics(font), pixmap.width() - icon.width() - 3);
+ text.replace( "...", ".." );
+ const int textX = pixmap.width() / 2 - QFontMetrics( font ).width( text ) / 2;
+ painter.setPen(textColor);
+ const QRect rect(textX + icon.width() / 2 + 2, 0, pixmap.width(), pixmap.height());
+ painter.drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, text);
+
+ // Draw the icon
+ painter.drawPixmap(textX - icon.width() / 2 - 2, pixmap.height() / 2 - icon.height() / 2, icon);
+
+ // Paint to widget
+ if (m_position == MultiTabBar::Left) {
+ paint->rotate(-90);
+ paint->drawPixmap(1 - pixmap.width(), 0, pixmap);
+ } else {
+ paint->drawPixmap(0, 0, pixmap);
+ }
+}
+
+QColor MultiTabBarTab::blendColors( const QColor& color1, const QColor& color2, int percent )
+{
+ const float factor1 = ( 100 - ( float ) percent ) / 100;
+ const float factor2 = ( float ) percent / 100;
+
+ const int r = static_cast<int>( color1.red() * factor1 + color2.red() * factor2 );
+ const int g = static_cast<int>( color1.green() * factor1 + color2.green() * factor2 );
+ const int b = static_cast<int>( color1.blue() * factor1 + color2.blue() * factor2 );
+
+ QColor result;
+ result.setRgb( r, g, b );
+
+ return result;
+}
+
+
+
+
+MultiTabBar::MultiTabBar( MultiTabBarMode bm, QWidget *parent, const char *name ) : QWidget( parent, name )
+{
+ m_buttons.setAutoDelete( false );
+ if ( bm == Vertical ) {
+ m_l = new QVBoxLayout( this );
+ setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding, true );
+ // setFixedWidth(24);
+ } else {
+ m_l = new QHBoxLayout( this );
+ setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed, true );
+ // setFixedHeight(24);
+ }
+ m_l->setMargin( 0 );
+ m_l->setAutoAdd( false );
+
+ m_internal = new MultiTabBarInternal( this, bm );
+ setPosition( ( bm == MultiTabBar::Vertical ) ? MultiTabBar::Right : MultiTabBar::Bottom );
+ setStyle( VSNET );
+ // setStyle(KDEV3);
+ //setStyle(KONQSBC);
+ m_l->insertWidget( 0, m_internal );
+ m_l->insertWidget( 0, m_btnTabSep = new QFrame( this ) );
+ m_btnTabSep->setFixedHeight( 4 );
+ m_btnTabSep->setFrameStyle( QFrame::Panel | QFrame::Sunken );
+ m_btnTabSep->setLineWidth( 2 );
+ m_btnTabSep->hide();
+
+ updateGeometry();
+}
+
+MultiTabBar::~MultiTabBar()
+{}
+
+/*int MultiTabBar::insertButton(QPixmap pic,int id ,const QString&)
+{
+(new KToolbarButton(pic,id,m_internal))->show();
+return 0;
+}*/
+
+int MultiTabBar::appendButton( const QPixmap &pic , int id, QPopupMenu *popup, const QString& )
+{
+ MultiTabBarButton * btn;
+ m_buttons.append(btn = new MultiTabBarButton(m_internal, pic, QString::null, popup, id, this, m_position, m_internal->m_style));
+
+ m_l->insertWidget( 0, btn );
+ btn->show();
+ m_btnTabSep->show();
+
+ return 0;
+}
+
+void MultiTabBar::updateSeparator()
+{
+ bool hideSep = true;
+ for ( QPtrListIterator<MultiTabBarButton> it( m_buttons );it.current();++it ) {
+ if ( it.current() ->isVisibleTo( this ) ) {
+ hideSep = false;
+ break;
+ }
+ }
+ if ( hideSep ) m_btnTabSep->hide();
+ else m_btnTabSep->show();
+
+}
+
+int MultiTabBar::appendTab( const QPixmap &pic , int id , const QString& text )
+{
+ m_internal->appendTab( pic, id, text );
+ return 0;
+}
+
+MultiTabBarButton* MultiTabBar::button( int id ) const
+{
+ for ( QPtrListIterator<MultiTabBarButton> it( m_buttons );it.current();++it ) {
+ if ( it.current() ->id() == id ) return it.current();
+ }
+ return 0;
+}
+
+MultiTabBarTab* MultiTabBar::tab( int id ) const
+{
+ return m_internal->tab( id );
+}
+
+
+
+void MultiTabBar::removeButton( int id )
+{
+ for ( uint pos = 0;pos < m_buttons.count();pos++ ) {
+ if ( m_buttons.at( pos ) ->id() == id ) {
+ m_buttons.take( pos ) ->deleteLater();
+ break;
+ }
+ }
+ if ( m_buttons.count() == 0 ) m_btnTabSep->hide();
+}
+
+void MultiTabBar::removeTab( int id )
+{
+ m_internal->removeTab( id );
+}
+
+void MultiTabBar::setTab( int id, bool state )
+{
+ MultiTabBarTab * ttab = tab( id );
+ if ( ttab ) {
+ ttab->setState( state );
+ }
+}
+
+bool MultiTabBar::isTabRaised( int id ) const
+{
+ MultiTabBarTab * ttab = tab( id );
+ if ( ttab ) {
+ return ttab->isOn();
+ }
+
+ return false;
+}
+
+
+void MultiTabBar::showActiveTabTexts( bool show )
+{
+ m_internal->showActiveTabTexts( show );
+}
+
+void MultiTabBar::setStyle( MultiTabBarStyle style )
+{
+ m_internal->setStyle( style );
+}
+
+void MultiTabBar::setPosition( MultiTabBarPosition pos )
+{
+ m_position = pos;
+ m_internal->setPosition( pos );
+ for ( uint i = 0;i < m_buttons.count();i++ )
+ m_buttons.at( i ) ->setPosition( pos );
+}
+void MultiTabBar::fontChange( const QFont& /* oldFont */ )
+{
+ for ( uint i = 0;i < tabs() ->count();i++ )
+ tabs() ->at( i ) ->resize();
+ repaint();
+}
+
+QPtrList<MultiTabBarTab> *MultiTabBar::tabs()
+{
+ return m_internal->tabs();
+}
+
+QPtrList<MultiTabBarButton>* MultiTabBar::buttons()
+{
+ return & m_buttons;
+}
+
+}
diff --git a/kftpgrabber/src/widgets/multitabbar.h b/kftpgrabber/src/widgets/multitabbar.h
new file mode 100644
index 0000000..ece61bf
--- /dev/null
+++ b/kftpgrabber/src/widgets/multitabbar.h
@@ -0,0 +1,281 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2001-2003 by Joseph Wenninger <jowenn@kde.org>
+ * Copyright (C) 2005 by Mark Kretschmann <markey@web.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSMULTITABBAR_H
+#define KFTPWIDGETSMULTITABBAR_H
+
+#include <qscrollview.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qlayout.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qpushbutton.h>
+
+class QPixmap;
+class QPainter;
+class QFrame;
+
+namespace KFTPWidgets {
+
+class MultiTabBarPrivate;
+class MultiTabBarTabPrivate;
+class MultiTabBarButtonPrivate;
+class MultiTabBarInternal;
+
+/**
+ * A Widget for horizontal and vertical tabs.
+ * It is possible to add normal buttons to the top/left
+ * The handling if only one tab at a time or multiple tabs
+ * should be raisable is left to the "user".
+ *
+ * @author Joseph Wenninger
+ */
+class MultiTabBar: public QWidget
+{
+Q_OBJECT
+friend class MultiTabBarButton;
+public:
+ enum MultiTabBarMode { Horizontal, Vertical };
+ enum MultiTabBarPosition { Left, Right, Top, Bottom };
+
+ /**
+ * VSNET == Visual Studio .Net like (only show the text of active tabs
+ * KDEV3 == Kdevelop 3 like (always show the text)
+ * KONQSBC == konqy's classic sidebar style (unthemed), this one is disabled
+ * at the moment, but will be renabled soon too
+ * AMAROK == A nice clean style by the amaroK team
+ */
+ enum MultiTabBarStyle { VSNET = 0, KDEV3 = 1, KONQSBC = 2, KDEV3ICON = 3, AMAROK = 4, STYLELAST = 0xffff };
+
+ MultiTabBar(MultiTabBarMode bm, QWidget *parent = 0, const char *name = 0);
+ virtual ~MultiTabBar();
+
+ /**
+ * append a new button to the button area. The button can later on be accessed with button(ID)
+ * eg for connecting signals to it
+ *
+ * @param pic a pixmap for the button
+ * @param id an arbitraty ID value. It will be emitted in the clicked signal for identifying the button
+ * if more than one button is connected to a signals.
+ * @param popup A popup menu which should be displayed if the button is clicked
+ * @param not_used_yet will be used for a popup text in the future
+ */
+ int appendButton(const QPixmap &pic, int id = -1, QPopupMenu* popup = 0, const QString& not_used_yet = QString::null);
+
+ /**
+ * remove a button with the given ID
+ */
+ void removeButton(int id);
+
+ /**
+ * append a new tab to the tab area. It can be accessed lateron with tabb(id);
+ * @param pic a bitmap for the tab
+ * @param id an arbitrary ID which can be used later on to identify the tab
+ * @param text if a mode with text is used it will be the tab text, otherwise a mouse over hint
+ */
+ int appendTab( const QPixmap &pic, int id = -1, const QString& text = QString::null );
+
+ /**
+ * remove a tab with a given ID
+ */
+ void removeTab( int id );
+ /**
+ * set a tab to "raised"
+ * @param id The ID of the tab to manipulate
+ * @param state true == activated/raised, false == not active
+ */
+ void setTab( int id , bool state );
+ /**
+ * return the state of a tab, identified by it's ID
+ */
+ bool isTabRaised( int id ) const;
+ /**
+ * get a pointer to a button within the button area identified by its ID
+ */
+ class MultiTabBarButton *button( int id ) const;
+
+ /**
+ * get a pointer to a tab within the tab area, identiifed by its ID
+ */
+ class MultiTabBarTab *tab( int id ) const;
+ /**
+ * set the real position of the widget.
+ * @param pos if the mode is horizontal, only use top, bottom, if it is vertical use left or right
+ */
+ void setPosition( MultiTabBarPosition pos );
+ /**
+ * set the display style of the tabs
+ */
+ void setStyle( MultiTabBarStyle style );
+ /**
+ * be carefull, don't delete tabs yourself and don't delete the list itself
+ */
+ QPtrList<MultiTabBarTab>* tabs();
+ /**
+ * be carefull, don't delete buttons yourself and don't delete the list itself
+ */
+ QPtrList<MultiTabBarButton>* buttons();
+
+ /**
+ * might vanish, not sure yet
+ */
+ void showActiveTabTexts( bool show = true );
+protected:
+ virtual void fontChange( const QFont& );
+ void updateSeparator();
+private:
+ class MultiTabBarInternal *m_internal;
+ QBoxLayout *m_l;
+ QFrame *m_btnTabSep;
+ QPtrList<MultiTabBarButton> m_buttons;
+ MultiTabBarPosition m_position;
+ MultiTabBarPrivate *d;
+};
+
+/**
+ * This class should never be created except with the appendButton call of MultiTabBar
+ */
+class MultiTabBarButton: public QPushButton
+{
+Q_OBJECT
+public:
+ MultiTabBarButton(MultiTabBarInternal *tb, const QPixmap& pic, const QString&, QPopupMenu *popup,
+ int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style);
+ MultiTabBarButton(MultiTabBarInternal *tb, const QString&, QPopupMenu *popup,
+ int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style);
+ virtual ~MultiTabBarButton();
+
+ int id() const;
+public slots:
+ /**
+ * this is used internaly, but can be used by the user, if (s)he wants to
+ * It the according call of MultiTabBar is invoked though this modifications will be overwritten
+ */
+ void setPosition( MultiTabBar::MultiTabBarPosition );
+ /**
+ * this is used internaly, but can be used by the user, if (s)he wants to
+ * It the according call of MultiTabBar is invoked though this modifications will be overwritten
+ */
+ void setStyle( MultiTabBar::MultiTabBarStyle );
+
+ /**
+ * modify the text of the button
+ */
+ void setText( const QString & );
+
+ QSize sizeHint() const;
+protected:
+ static const int ANIM_INTERVAL = 18;
+ static const int ANIM_MAX = 20;
+
+ MultiTabBarInternal *m_tb;
+
+ MultiTabBar::MultiTabBarPosition m_position;
+ MultiTabBar::MultiTabBarStyle m_style;
+
+ QString m_text;
+ int m_id;
+ bool m_animEnter;
+ int m_animCount;
+ class QTimer *m_animTimer;
+
+ virtual void hideEvent(class QHideEvent*);
+ virtual void showEvent(class QShowEvent*);
+ virtual void enterEvent(class QEvent*);
+ virtual void leaveEvent(class QEvent*);
+private:
+ MultiTabBarButtonPrivate *d;
+signals:
+ /**
+ * this is emitted if the button is clicked
+ * @param id the ID identifying the button
+ */
+ void clicked(int id);
+protected slots:
+ virtual void slotClicked();
+ virtual void slotAnimTimer();
+};
+
+/**
+ * This class should never be created except with the appendTab call of MultiTabBar
+ */
+class MultiTabBarTab: public MultiTabBarButton
+{
+Q_OBJECT
+friend class MultiTabBarInternal;
+public:
+ MultiTabBarTab(MultiTabBarInternal *tb, const QPixmap &pic, const QString&, int id, QWidget *parent,
+ MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style);
+ virtual ~MultiTabBarTab();
+ /**
+ * set the active state of the tab
+ * @param state true==active false==not active
+ */
+ void setState( bool state );
+ /**
+ * choose if the text should always be displayed
+ * this is only used in classic mode if at all
+ */
+ void showActiveTabText( bool show );
+ void resize() { setSize( neededSize() ); }
+private:
+ bool m_showActiveTabText;
+ int m_expandedSize;
+
+ MultiTabBarTabPrivate *d;
+protected:
+ void setSize( int );
+ int neededSize();
+ void updateState();
+ virtual void drawButton( QPainter * );
+ virtual void drawButtonLabel( QPainter * );
+ void drawButtonStyled( QPainter * );
+ void drawButtonClassic( QPainter * );
+ void drawButtonAmarok( QPainter * );
+ QColor blendColors( const QColor& color1, const QColor& color2, int percent );
+protected slots:
+ virtual void slotClicked();
+ void setTabsPosition( MultiTabBar::MultiTabBarPosition );
+public slots:
+ virtual void setIcon( const QString& );
+ virtual void setIcon( const QPixmap& );
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/multitabbar_p.h b/kftpgrabber/src/widgets/multitabbar_p.h
new file mode 100644
index 0000000..c630f61
--- /dev/null
+++ b/kftpgrabber/src/widgets/multitabbar_p.h
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2001-2003 by Joseph Wenninger <jowenn@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
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSMULTITABBAR_P_H
+#define KFTPWIDGETSMULTITABBAR_P_H
+
+#include <qscrollview.h>
+
+#include "multitabbar.h"
+
+namespace KFTPWidgets {
+
+class MultiTabBarInternal : public QScrollView
+{
+Q_OBJECT
+friend class MultiTabBar;
+public:
+ MultiTabBarInternal(QWidget *parent,MultiTabBar::MultiTabBarMode bm);
+ int appendTab(const QPixmap &,int=-1,const QString& =QString::null);
+ MultiTabBarTab *tab(int) const;
+ void removeTab(int);
+ void setPosition(enum MultiTabBar::MultiTabBarPosition pos);
+ void setStyle(enum MultiTabBar::MultiTabBarStyle style);
+ void showActiveTabTexts(bool show);
+ QPtrList<MultiTabBarTab>* tabs() { return &m_tabs; }
+private:
+ QWidget *box;
+ QBoxLayout *mainLayout;
+ QPtrList<MultiTabBarTab> m_tabs;
+ enum MultiTabBar::MultiTabBarPosition m_position;
+ bool m_showActiveTabTexts;
+ enum MultiTabBar::MultiTabBarStyle m_style;
+ int m_expandedTabSize;
+ int m_lines;
+ MultiTabBar::MultiTabBarMode m_barMode;
+protected:
+ virtual bool eventFilter(QObject *,QEvent*);
+ virtual void drawContents ( QPainter *, int, int, int, int);
+
+ /**
+ * [contentsM|m]ousePressEvent are reimplemented from QScrollView
+ * in order to ignore all mouseEvents on the viewport, so that the
+ * parent can handle them.
+ */
+ virtual void contentsMousePressEvent(QMouseEvent *);
+ virtual void mousePressEvent(QMouseEvent *);
+ virtual void resizeEvent(QResizeEvent *);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/overlaywidget.cpp b/kftpgrabber/src/widgets/overlaywidget.cpp
new file mode 100644
index 0000000..58ae387
--- /dev/null
+++ b/kftpgrabber/src/widgets/overlaywidget.cpp
@@ -0,0 +1,83 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2005 Max Howell <max.howell@methyblue.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "overlaywidget.h"
+
+#include <qpoint.h>
+
+namespace KFTPWidgets {
+
+OverlayWidget::OverlayWidget(QWidget *parent, QWidget *anchor)
+ : QFrame(parent->parentWidget()),
+ m_parent(parent),
+ m_anchor(anchor)
+{
+ parent->installEventFilter(this);
+ hide();
+}
+
+void OverlayWidget::reposition()
+{
+ setMaximumSize(parentWidget()->size());
+ adjustSize();
+
+ // P is in the alignWidget's coordinates
+ QPoint p;
+
+ p.setX(m_anchor->width() - width());
+ p.setY(-height());
+
+ // Position in the toplevelWidget's coordinates
+ QPoint pTopLevel = m_anchor->mapTo(topLevelWidget(), p);
+
+ // Position in the widget's parentWidget coordinates
+ QPoint pParent = parentWidget()->mapFrom(topLevelWidget(), pTopLevel);
+
+ if (pParent.x() < 0)
+ pParent.rx() = 0;
+
+ move(pParent);
+}
+
+bool OverlayWidget::event(QEvent *event)
+{
+ if (event->type() == QEvent::ChildInserted)
+ adjustSize();
+
+ return QFrame::event(event);
+}
+
+}
diff --git a/kftpgrabber/src/widgets/overlaywidget.h b/kftpgrabber/src/widgets/overlaywidget.h
new file mode 100644
index 0000000..1140909
--- /dev/null
+++ b/kftpgrabber/src/widgets/overlaywidget.h
@@ -0,0 +1,60 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2005 Max Howell <max.howell@methyblue.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETSOVERLAYWIDGET_H
+#define KFTPWIDGETSOVERLAYWIDGET_H
+
+#include <qhbox.h>
+
+namespace KFTPWidgets {
+
+/**
+ * @author Max Howell
+ */
+class OverlayWidget : public QFrame {
+public:
+ OverlayWidget(QWidget *parent, QWidget *anchor);
+ virtual void reposition();
+protected:
+ virtual bool event(QEvent *event);
+private:
+ QWidget *m_parent;
+ QWidget *m_anchor;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/popupmessage.cpp b/kftpgrabber/src/widgets/popupmessage.cpp
new file mode 100644
index 0000000..62ee3c8
--- /dev/null
+++ b/kftpgrabber/src/widgets/popupmessage.cpp
@@ -0,0 +1,314 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2005 Max Howell <max.howell@methyblue.com>
+ * Copyright (C) 2005 Seb Ruiz <me@sebruiz.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "popupmessage.h"
+
+#include <kactivelabel.h>
+#include <kpushbutton.h>
+#include <kstdguiitem.h>
+
+#include <qfont.h>
+#include <qframe.h>
+#include <qlabel.h>
+#include <qmessagebox.h>
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+
+namespace KFTPWidgets {
+
+PopupMessage::PopupMessage(QWidget *parent, QWidget *anchor, int timeout)
+ : OverlayWidget(parent, anchor),
+ m_anchor(anchor),
+ m_parent(parent),
+ m_maskEffect(Slide),
+ m_dissolveSize(0),
+ m_dissolveDelta(-1),
+ m_offset(0),
+ m_counter(0),
+ m_stage(1),
+ m_timeout(timeout),
+ m_showCounter(true)
+{
+ setFrameStyle(QFrame::Panel | QFrame::Raised);
+ setFrameShape(QFrame::StyledPanel);
+ setWFlags(Qt::WX11BypassWM);
+
+ QPalette p = QToolTip::palette();
+ setPalette(p);
+
+ QHBoxLayout *hbox;
+ QLabel *label;
+ KActiveLabel *alabel;
+
+ m_layout = new QVBoxLayout(this, 9, 6);
+ hbox = new QHBoxLayout(m_layout, 12);
+
+ hbox->addWidget(m_countdownFrame = new QFrame(this, "counterVisual"));
+ m_countdownFrame->setFixedWidth(fontMetrics().width("X"));
+ m_countdownFrame->setFrameStyle(QFrame::Plain | QFrame::Box);
+ m_countdownFrame->setPaletteForegroundColor(paletteBackgroundColor().dark());
+
+ label = new QLabel(this, "image");
+ hbox->add(label);
+
+ alabel = new KActiveLabel(this, "label");
+ alabel->setTextFormat(Qt::RichText);
+ alabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+ alabel->setPalette(p);
+
+ hbox->add(alabel);
+
+ hbox = new QHBoxLayout(m_layout);
+
+ hbox->addItem(new QSpacerItem(4, 4, QSizePolicy::Expanding, QSizePolicy::Preferred));
+ hbox->add(new KPushButton(KStdGuiItem::close(), this, "closeButton"));
+
+ connect(child("closeButton"), SIGNAL(clicked()), SLOT(close()));
+}
+
+void PopupMessage::addWidget(QWidget *widget)
+{
+ m_layout->add(widget);
+ adjustSize();
+}
+
+void PopupMessage::setShowCloseButton(bool show)
+{
+ static_cast<KPushButton*>(child("closeButton"))->setShown(show);
+ adjustSize();
+}
+
+void PopupMessage::setShowCounter(bool show)
+{
+ m_showCounter = show;
+ static_cast<QFrame*>(child("counterVisual"))->setShown(show);
+ adjustSize();
+}
+
+void PopupMessage::setText(const QString &text)
+{
+ static_cast<KActiveLabel*>(child("label"))->setText(text);
+ adjustSize();
+}
+
+void PopupMessage::setImage(const QString &location)
+{
+ static_cast<QLabel*>(child("image"))->setPixmap(QPixmap(location));
+ adjustSize();
+}
+
+void PopupMessage::setImage(const QPixmap &pix)
+{
+ static_cast<QLabel*>(child("image"))->setPixmap(pix);
+ adjustSize();
+}
+
+void PopupMessage::close()
+{
+ m_stage = 3;
+ killTimer(m_timerId);
+ m_timerId = startTimer(6);
+}
+
+void PopupMessage::display()
+{
+ m_dissolveSize = 24;
+ m_dissolveDelta = -1;
+
+ if (m_maskEffect == Dissolve) {
+ m_mask.resize(width(), height());
+ dissolveMask();
+ m_timerId = startTimer(1000 / 30);
+ } else {
+ m_timerId = startTimer( 6 );
+ }
+
+ show();
+}
+
+void PopupMessage::timerEvent(QTimerEvent*)
+{
+ switch(m_maskEffect) {
+ case Plain: plainMask(); break;
+ case Slide: slideMask(); break;
+ case Dissolve: dissolveMask(); break;
+ }
+}
+
+void PopupMessage::countDown()
+{
+ if (!m_timeout) {
+ killTimer(m_timerId);
+ return;
+ }
+
+ QFrame *&h = m_countdownFrame;
+
+ if (m_counter < h->height() - 3)
+ QPainter(h).fillRect(2, 2, h->width() - 4, m_counter, palette().active().highlight());
+
+ if (!hasMouse())
+ m_counter++;
+
+ if (m_counter > h->height()) {
+ m_stage = 3;
+ killTimer(m_timerId);
+ m_timerId = startTimer(6);
+ } else {
+ killTimer(m_timerId);
+ m_timerId = startTimer(m_timeout / h->height());
+ }
+}
+
+void PopupMessage::dissolveMask()
+{
+ if (m_stage == 1) {
+ repaint(false);
+ QPainter maskPainter(&m_mask);
+
+ m_mask.fill(Qt::black);
+
+ maskPainter.setBrush(Qt::white);
+ maskPainter.setPen(Qt::white);
+ maskPainter.drawRect(m_mask.rect());
+
+ m_dissolveSize += m_dissolveDelta;
+
+ if (m_dissolveSize > 0) {
+ maskPainter.setRasterOp(Qt::EraseROP);
+
+ int x, y, s;
+ const int size = 16;
+
+ for (y = 0; y < height() + size; y += size) {
+ x = width();
+ s = m_dissolveSize * x / 128;
+
+ for (; x > size; x -= size, s -= 2) {
+ if (s < 0)
+ break;
+
+ maskPainter.drawEllipse(x - s / 2, y - s / 2, s, s);
+ }
+ }
+ } else if (m_dissolveSize < 0) {
+ m_dissolveDelta = 1;
+ killTimer(m_timerId);
+
+ if (m_timeout) {
+ m_timerId = startTimer(40);
+ m_stage = 2;
+ }
+ }
+
+ setMask(m_mask);
+ } else if (m_stage == 2) {
+ countDown();
+ } else {
+ deleteLater();
+ }
+}
+
+void PopupMessage::plainMask()
+{
+ switch (m_stage) {
+ case 1: {
+ // Raise
+ killTimer(m_timerId);
+
+ if (m_timeout) {
+ m_timerId = startTimer(40);
+ m_stage = 2;
+ }
+
+ break;
+ }
+
+ case 2: {
+ // Counter
+ countDown();
+ break;
+ }
+
+ case 3: {
+ // Lower/Remove
+ deleteLater();
+ break;
+ }
+ }
+}
+
+void PopupMessage::slideMask()
+{
+ switch (m_stage) {
+ case 1: {
+ // Raise
+ move(0, m_parent->y() - m_offset);
+ m_offset++;
+
+ if (m_offset > height()) {
+ killTimer(m_timerId);
+
+ if (m_timeout) {
+ m_timerId = startTimer(40);
+ m_stage = 2;
+ }
+ }
+ break;
+ }
+
+ case 2: {
+ // Fill in pause timer bar
+ countDown();
+ break;
+ }
+
+ case 3: {
+ // Lower
+ m_offset--;
+ move(0, m_parent->y() - m_offset);
+
+ if (m_offset < 0)
+ deleteLater();
+ }
+ }
+}
+
+}
+
+#include "popupmessage.moc"
diff --git a/kftpgrabber/src/widgets/popupmessage.h b/kftpgrabber/src/widgets/popupmessage.h
new file mode 100644
index 0000000..0550d41
--- /dev/null
+++ b/kftpgrabber/src/widgets/popupmessage.h
@@ -0,0 +1,113 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2005 Max Howell <max.howell@methyblue.com>
+ * Copyright (C) 2005 Seb Ruiz <me@sebruiz.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETSPOPUPMESSAGE_H
+#define KFTPWIDGETSPOPUPMESSAGE_H
+
+#include "overlaywidget.h"
+
+#include <qbitmap.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+
+namespace KFTPWidgets {
+
+/**
+ * Widget that animates itself into a position relative to an anchor widget.
+ */
+class PopupMessage : public OverlayWidget {
+Q_OBJECT
+public:
+ /**
+ * Possible animation effects.
+ */
+ enum MaskEffect {
+ Plain,
+ Slide,
+ Dissolve
+ };
+
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ * @param anchor Which widget to tie the popup widget to
+ * @param timeout How long to wait before auto closing
+ */
+ PopupMessage(QWidget *parent, QWidget *anchor, int timeout = 5000);
+
+ void addWidget(QWidget *widget);
+ void setShowCloseButton(bool show);
+ void setShowCounter(bool show);
+ void setImage(const QString &location);
+ void setImage(const QPixmap &pixmap);
+ void setMaskEffect(MaskEffect type) { m_maskEffect = type; }
+ void setText(const QString &text);
+ void setTimeout(int timeout) { m_timeout = timeout; }
+public slots:
+ void close();
+ void display();
+protected:
+ void timerEvent(QTimerEvent *event);
+ void countDown();
+
+ void dissolveMask();
+ void plainMask();
+ void slideMask();
+private:
+ QVBoxLayout *m_layout;
+ QFrame *m_countdownFrame;
+ QWidget *m_anchor;
+ QWidget *m_parent;
+ QBitmap m_mask;
+ MaskEffect m_maskEffect;
+
+ int m_dissolveSize;
+ int m_dissolveDelta;
+
+ int m_offset;
+ int m_counter;
+ int m_stage;
+ int m_timeout;
+ int m_timerId;
+
+ bool m_showCounter;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/queueview/Makefile.am b/kftpgrabber/src/widgets/queueview/Makefile.am
new file mode 100644
index 0000000..5ba11d9
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/Makefile.am
@@ -0,0 +1,13 @@
+INCLUDES = -I$(srcdir)/../.. \
+ -I$(srcdir)/../../engine \
+ -I$(srcdir)/../../misc \
+ -I$(srcdir)/../../ui -I../../ui\
+ -I$(srcdir)/.. \
+ -I$(srcdir)/../browser \
+ $(all_includes)
+
+METASOURCES = AUTO
+noinst_LIBRARIES = libqueueviewwidget.a
+libqueueviewwidget_a_SOURCES = queueeditor.cpp queueview.cpp threadview.cpp
+
+noinst_HEADERS = queueeditor.h queueview.h threadview.h
diff --git a/kftpgrabber/src/widgets/queueview/queueeditor.cpp b/kftpgrabber/src/widgets/queueview/queueeditor.cpp
new file mode 100644
index 0000000..c565165
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/queueeditor.cpp
@@ -0,0 +1,323 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "queueeditor.h"
+#include "kftpserverlineedit.h"
+#include "kftpbookmarks.h"
+#include "kftpqueueeditorlayout.h"
+
+#include <klineedit.h>
+#include <kpassdlg.h>
+#include <kcombobox.h>
+#include <klocale.h>
+
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+
+#define REMOTE_PROTOCOL m_transfer->getSourceUrl().isLocalFile() ? m_transfer->getDestUrl().protocol() : m_transfer->getSourceUrl().protocol()
+
+namespace KFTPWidgets {
+
+QueueEditor::QueueEditor(QWidget *parent, const char *name)
+: KDialogBase(parent, name, true, "Edit queue", KDialogBase::Ok | KDialogBase::Cancel,
+ KDialogBase::Ok, true)
+{
+ m_layout = new KFTPQueueEditorLayout(this);
+ setMainWidget(m_layout);
+
+ connect(m_layout->srcPath, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+ connect(m_layout->dstPath, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+
+ connect(m_layout->srcHost, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+ connect(m_layout->srcUser, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+ connect(m_layout->srcPass, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+
+ connect(m_layout->dstHost, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+ connect(m_layout->dstUser, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+ connect(m_layout->dstPass, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged()));
+
+ connect(m_layout->srcName, SIGNAL(siteChanged(KFTPBookmarks::Site*)), this, SLOT(slotSourceSiteChanged(KFTPBookmarks::Site*)));
+ connect(m_layout->dstName, SIGNAL(siteChanged(KFTPBookmarks::Site*)), this, SLOT(slotDestSiteChanged(KFTPBookmarks::Site*)));
+
+ connect(m_layout->transferType, SIGNAL(activated(int)), this, SLOT(slotTransferModeChanged(int)));
+
+ setMaximumHeight(250);
+ setInitialSize(QSize(500, 250));
+
+ enableButtonOK(false);
+}
+
+void QueueEditor::resetTabs()
+{
+ m_layout->serverTab->setTabEnabled(m_layout->tab, false);
+ m_layout->serverTab->setTabEnabled(m_layout->tab_2, false);
+}
+
+void QueueEditor::resetServerData()
+{
+ // Source
+ m_layout->srcName->clear();
+ m_layout->srcHost->setText("");
+ m_layout->srcPort->setValue(21);
+ m_layout->srcUser->setText("");
+ m_layout->srcPass->erase();
+
+ // Destination
+ m_layout->dstName->clear();
+ m_layout->dstHost->setText("");
+ m_layout->dstPort->setValue(21);
+ m_layout->dstUser->setText("");
+ m_layout->dstPass->erase();
+}
+
+void QueueEditor::slotTransferModeChanged(int index)
+{
+ if (m_lastTransferType == index)
+ return;
+ else
+ m_lastTransferType = (KFTPQueue::TransferType) index;
+
+ resetTabs();
+ resetServerData();
+
+ switch (index) {
+ case 0: {
+ // Download - source: remote dest: local
+ m_layout->serverTab->setTabEnabled(m_layout->tab, true);
+ m_layout->serverTab->showPage(m_layout->tab);
+ break;
+ }
+ case 1: {
+ // Upload - source: local dest: remote
+ m_layout->serverTab->setTabEnabled(m_layout->tab_2, true);
+ m_layout->serverTab->showPage(m_layout->tab_2);
+ break;
+ }
+ case 2: {
+ // FXP - source: remote dest: remote
+ m_layout->serverTab->setTabEnabled(m_layout->tab, true);
+ m_layout->serverTab->setTabEnabled(m_layout->tab_2, true);
+ m_layout->serverTab->showPage(m_layout->tab);
+ break;
+ }
+ }
+
+ slotTextChanged();
+}
+
+bool QueueEditor::sourceIsValid()
+{
+ if (m_lastTransferType == 1) return true;
+
+ if (m_layout->srcHost->text().stripWhiteSpace().isEmpty() || m_layout->srcUser->text().stripWhiteSpace().isEmpty())
+ return false;
+ else
+ return true;
+}
+
+bool QueueEditor::destIsValid()
+{
+ if (m_lastTransferType == 0) return true;
+
+ if (m_layout->dstHost->text().stripWhiteSpace().isEmpty() || m_layout->dstUser->text().stripWhiteSpace().isEmpty())
+ return false;
+ else
+ return true;
+}
+
+void QueueEditor::slotTextChanged()
+{
+ if (m_layout->srcPath->text().stripWhiteSpace().isEmpty() || m_layout->dstPath->text().stripWhiteSpace().isEmpty() ||
+ m_layout->srcPath->text().left(1) != "/" || m_layout->dstPath->text().left(1) != "/" ||
+ !sourceIsValid() || !destIsValid() )
+ enableButtonOK(false);
+ else
+ enableButtonOK(true);
+}
+
+void QueueEditor::setData(KFTPQueue::Transfer *transfer)
+{
+ KURL sUrl, dUrl;
+
+ m_layout->srcPath->setText(transfer->getSourceUrl().path());
+ m_layout->dstPath->setText(transfer->getDestUrl().path());
+
+ // Source
+ sUrl = transfer->getSourceUrl();
+
+ if (!sUrl.isLocalFile()) {
+ m_layout->srcName->setCurrentSite(KFTPBookmarks::Manager::self()->findSite(sUrl));
+ m_layout->srcHost->setText(sUrl.host());
+ m_layout->srcPort->setValue(sUrl.port());
+ m_layout->srcUser->setText(sUrl.user());
+
+ m_layout->srcPass->erase();
+ m_layout->srcPass->insert(sUrl.pass());
+ } else {
+ m_layout->serverTab->setTabEnabled(m_layout->tab, false);
+ }
+
+ // Destination
+ dUrl = transfer->getDestUrl();
+
+ if (!dUrl.isLocalFile()) {
+ m_layout->dstName->setCurrentSite(KFTPBookmarks::Manager::self()->findSite(dUrl));
+ m_layout->dstHost->setText(dUrl.host());
+ m_layout->dstPort->setValue(dUrl.port());
+ m_layout->dstUser->setText(dUrl.user());
+
+ m_layout->dstPass->erase();
+ m_layout->dstPass->insert(dUrl.pass());
+ } else {
+ m_layout->serverTab->setTabEnabled(m_layout->tab_2, false);
+ }
+
+ // Transfer type
+ m_lastTransferType = transfer->getTransferType();
+ m_layout->transferType->setCurrentItem(m_lastTransferType);
+
+ m_transfer = transfer;
+}
+
+void QueueEditor::saveData()
+{
+ KURL sUrl, dUrl;
+
+ if (m_lastTransferType != 1) {
+ sUrl.setProtocol(REMOTE_PROTOCOL);
+ sUrl.setHost(m_layout->srcHost->text());
+ sUrl.setPort(m_layout->srcPort->value());
+ sUrl.setUser(m_layout->srcUser->text());
+ sUrl.setPass(m_layout->srcPass->password());
+
+ if (m_transfer->getSourceUrl().pass().isEmpty() && sUrl.pass().isEmpty())
+ sUrl.setPass(QString::null);
+ } else {
+ sUrl.setProtocol("file");
+ }
+
+ sUrl.setPath(m_layout->srcPath->text());
+
+ if (m_lastTransferType != 0) {
+ dUrl.setProtocol(REMOTE_PROTOCOL);
+ dUrl.setHost(m_layout->dstHost->text());
+ dUrl.setPort(m_layout->dstPort->value());
+ dUrl.setUser(m_layout->dstUser->text());
+ dUrl.setPass(m_layout->dstPass->password());
+
+ if (m_transfer->getDestUrl().pass().isEmpty() && dUrl.pass().isEmpty())
+ dUrl.setPass(QString::null);
+ } else {
+ dUrl.setProtocol("file");
+ }
+
+ dUrl.setPath(m_layout->dstPath->text());
+
+ m_transfer->setSourceUrl(sUrl);
+ m_transfer->setDestUrl(dUrl);
+ m_transfer->setTransferType(m_lastTransferType);
+
+ // If the transfer is a directory, we have to update all child transfers
+ // as well.
+ if (m_transfer->isDir())
+ recursiveSaveData(static_cast<KFTPQueue::TransferDir*>(m_transfer), sUrl, dUrl);
+}
+
+void QueueEditor::recursiveSaveData(KFTPQueue::TransferDir *parent, const KURL &srcUrl, const KURL &dstUrl)
+{
+ KFTPQueue::QueueObject *o;
+ QPtrList<KFTPQueue::QueueObject> children = parent->getChildrenList();
+
+ KURL sUrl, dUrl;
+
+ for (o = children.first(); o; o = children.next()) {
+ KFTPQueue::Transfer *i = static_cast<KFTPQueue::Transfer*>(o);
+
+ // Modify the urls
+ sUrl = srcUrl;
+ dUrl = dstUrl;
+
+ sUrl.addPath(i->getSourceUrl().fileName());
+ dUrl.addPath(i->getDestUrl().fileName());
+
+ // Set the urls
+ i->setSourceUrl(sUrl);
+ i->setDestUrl(dUrl);
+ i->setTransferType(m_lastTransferType);
+ i->emitUpdate();
+
+ if (i->isDir())
+ recursiveSaveData(static_cast<KFTPQueue::TransferDir*>(i), sUrl, dUrl);
+ }
+}
+
+void QueueEditor::slotSourceSiteChanged(KFTPBookmarks::Site *site)
+{
+ if (site) {
+ m_layout->srcHost->setText(site->getProperty("host"));
+ m_layout->srcPort->setValue(site->getIntProperty("port"));
+ m_layout->srcUser->setText(site->getProperty("username"));
+ m_layout->srcPass->erase();
+ m_layout->srcPass->insert(site->getProperty("password"));
+ } else {
+ m_layout->srcHost->clear();
+ m_layout->srcPort->setValue(21);
+ m_layout->srcUser->clear();
+ m_layout->srcPass->erase();
+ }
+}
+
+void QueueEditor::slotDestSiteChanged(KFTPBookmarks::Site *site)
+{
+ if (site) {
+ m_layout->dstHost->setText(site->getProperty("host"));
+ m_layout->dstPort->setValue(site->getIntProperty("port"));
+ m_layout->dstUser->setText(site->getProperty("username"));
+ m_layout->dstPass->erase();
+ m_layout->dstPass->insert(site->getProperty("password"));
+ } else {
+ m_layout->dstHost->clear();
+ m_layout->dstPort->setValue(21);
+ m_layout->dstUser->clear();
+ m_layout->dstPass->erase();
+ }
+}
+
+}
+
+#include "queueeditor.moc"
+
diff --git a/kftpgrabber/src/widgets/queueview/queueeditor.h b/kftpgrabber/src/widgets/queueview/queueeditor.h
new file mode 100644
index 0000000..09027d6
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/queueeditor.h
@@ -0,0 +1,82 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEEDITOR_H
+#define KFTPQUEUEEDITOR_H
+
+#include "kftpqueue.h"
+#include "kftpbookmarks.h"
+
+#include <kdialogbase.h>
+#include <qdom.h>
+
+class KFTPQueueEditorLayout;
+
+namespace KFTPWidgets {
+
+/**
+@author Jernej Kos
+*/
+class QueueEditor : public KDialogBase
+{
+Q_OBJECT
+public:
+ QueueEditor(QWidget *parent = 0, const char *name = 0);
+
+ void setData(KFTPQueue::Transfer *transfer);
+ void saveData();
+private:
+ KFTPQueueEditorLayout *m_layout;
+ KFTPQueue::Transfer *m_transfer;
+ KFTPQueue::TransferType m_lastTransferType;
+
+ void resetTabs();
+ void resetServerData();
+
+ bool sourceIsValid();
+ bool destIsValid();
+
+ void recursiveSaveData(KFTPQueue::TransferDir *parent, const KURL &srcUrl, const KURL &dstUrl);
+private slots:
+ void slotTextChanged();
+ void slotTransferModeChanged(int index);
+
+ void slotSourceSiteChanged(KFTPBookmarks::Site *site);
+ void slotDestSiteChanged(KFTPBookmarks::Site *site);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/queueview/queueview.cpp b/kftpgrabber/src/widgets/queueview/queueview.cpp
new file mode 100644
index 0000000..4fc8e5f
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/queueview.cpp
@@ -0,0 +1,888 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2005 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "misc.h"
+
+#include "listview.h"
+#include "queueview.h"
+#include "kftpqueue.h"
+#include "kftpapi.h"
+#include "queueeditor.h"
+#include "widgets/searchdialog.h"
+#include "misc/config.h"
+
+#include <kapplication.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <kio/job.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kpopupmenu.h>
+#include <klistviewsearchline.h>
+#include <kdebug.h>
+
+#include <qspinbox.h>
+#include <qtooltip.h>
+
+using namespace KFTPGrabberBase;
+using namespace KFTPCore;
+
+namespace KFTPWidgets {
+
+QueueViewItem::QueueViewItem(QueueView *view, KFTPQueue::QueueObject *object, QListView *parent)
+ : QListViewItem(parent),
+ m_lastChild(0),
+ m_queueObject(object),
+ m_queueView(view),
+ m_queueId(object->getId())
+{
+ init();
+}
+
+QueueViewItem::QueueViewItem(QueueView *view, KFTPQueue::QueueObject *object, QListViewItem *parent)
+ : QListViewItem(parent, static_cast<QueueViewItem*>(parent)->lastChild()),
+ m_lastChild(0),
+ m_queueObject(object),
+ m_queueView(view),
+ m_queueId(object->getId())
+{
+ init();
+}
+
+QueueViewItem::~QueueViewItem()
+{
+ m_queueView->m_queuedItems.remove(m_queueId);
+}
+
+void QueueViewItem::insertItem(QListViewItem *newChild)
+{
+ QListViewItem::insertItem(newChild);
+ m_lastChild = newChild;
+}
+
+void QueueViewItem::takeItem(QListViewItem *item)
+{
+ if (item == m_lastChild) {
+ QListViewItem *above = item->itemAbove();
+
+ if (above->parent() == m_lastChild->parent())
+ m_lastChild = above;
+ else
+ m_lastChild = 0;
+ }
+
+ QListViewItem::takeItem(item);
+}
+
+void QueueViewItem::moveUp()
+{
+ QListViewItem *above = itemAbove();
+
+ if (above && above->parent() == QListViewItem::parent()) {
+ QListViewItem *previous = above->itemAbove();
+
+ if (previous && previous->parent() == QListViewItem::parent()) {
+ QueueViewItem *parent = static_cast<QueueViewItem*>(QListViewItem::parent());
+ moveItem(previous);
+
+ if (parent && this == parent->lastChild())
+ parent->m_lastChild = above;
+ } else {
+ moveToTop();
+ }
+ }
+}
+
+void QueueViewItem::moveDown()
+{
+ QueueViewItem *parent = static_cast<QueueViewItem*>(QListViewItem::parent());
+ QueueViewItem *next = static_cast<QueueViewItem*>(nextSibling());
+
+ if (next) {
+ moveItem(next);
+
+ if (parent && parent->lastChild() == next)
+ parent->m_lastChild = this;
+ }
+}
+
+void QueueViewItem::moveToTop()
+{
+ QueueViewItem *parent = static_cast<QueueViewItem*>(QListViewItem::parent());
+
+ // Just reinsert the item
+ if (parent) {
+ if (this == parent->lastChild())
+ parent->m_lastChild = itemAbove();
+
+ parent->QListViewItem::takeItem(this);
+ parent->QListViewItem::insertItem(this);
+ } else {
+ ListView *view = m_queueView->m_queue;
+ view->QListView::takeItem(this);
+ view->QListView::insertItem(this);
+ }
+}
+
+void QueueViewItem::moveToBottom()
+{
+ QueueViewItem *parent = static_cast<QueueViewItem*>(QListViewItem::parent());
+
+ // Just reinsert the item
+ if (parent) {
+ QListViewItem *last = parent->lastChild();
+
+ parent->takeItem(this);
+ parent->insertItem(this);
+ moveItem(last);
+ } else {
+ ListView *view = m_queueView->m_queue;
+ view->takeItem(this);
+ view->insertItem(this);
+ }
+}
+
+void QueueViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
+{
+ QColorGroup _cg(cg);
+ QColor c = _cg.text();
+
+ QColor n_color;
+
+ if (m_queueObject && m_queueObject->isTransfer()) {
+ switch (m_queueObject->getStatus()) {
+ case KFTPQueue::Transfer::Running: n_color.setRgb(255, 0, 0); break;
+ case KFTPQueue::Transfer::Connecting: n_color.setRgb(0, 0, 255); break;
+ case KFTPQueue::Transfer::Waiting: n_color.setRgb(0, 0, 255); break;
+ case KFTPQueue::Transfer::Locked: n_color.setRgb(0, 150, 0); break;
+ default: break;
+ }
+ }
+
+ if (n_color.isValid())
+ _cg.setColor(QColorGroup::Text, n_color);
+
+ QListViewItem::paintCell(p, _cg, column, width, alignment);
+ _cg.setColor(QColorGroup::Text, c);
+}
+
+void QueueViewItem::init()
+{
+ if (m_queueObject->isTransfer()) {
+ KFTPQueue::Transfer *transfer = static_cast<KFTPQueue::Transfer*>(getObject());
+
+ setText(0, transfer->getSourceUrl().fileName());
+ setText(1, KIO::convertSize(transfer->getActualSize()));
+ setText(2, transfer->getSourceUrl().pathOrURL());
+ setText(3, transfer->getDestUrl().pathOrURL());
+
+ // Icon
+ QString iconText;
+ if (transfer->isDir()) {
+ iconText = "folder";
+ } else {
+ KMimeType::Ptr theType = KMimeType::findByURL("/" + transfer->getSourceUrl().path(), 0, false, true);
+ iconText = theType->icon(QString::null, false);
+ }
+
+ setPixmap(0, loadSmallPixmap(iconText));
+ } else if (m_queueObject->getType() == KFTPQueue::QueueObject::Site) {
+ KFTPQueue::Site *site = static_cast<KFTPQueue::Site*>(getObject());
+
+ setText(0, QString("%1:%2").arg(site->getUrl().host()).arg(site->getUrl().port()));
+ setText(1, KIO::convertSize(site->getActualSize()));
+
+ // Set the pixmap
+ setPixmap(0, loadSmallPixmap("server"));
+ }
+}
+
+void QueueViewItem::refresh()
+{
+ if (!m_queueObject)
+ return;
+
+ if (m_queueObject->isTransfer()) {
+ KFTPQueue::Transfer *transfer = static_cast<KFTPQueue::Transfer*>(getObject());
+
+ // Speed
+ bool noSpeed = transfer->getStatus() == KFTPQueue::Transfer::Waiting || transfer->getStatus() == KFTPQueue::Transfer::Connecting;
+ QString speed;
+ if ((!transfer->isDir() || !isOpen()) && transfer->isRunning() && !noSpeed) {
+ speed.sprintf( "%lld B/s", (transfer->getSpeed()) );
+
+ if (transfer->getSpeed() > 1024)
+ speed.sprintf( "%lld KB/s", (transfer->getSpeed() / 1024) );
+
+ if (transfer->getSpeed() > 1024*1024)
+ speed.sprintf("%lld MB/s", (transfer->getSpeed() / 1024) / 1024);
+
+ if (transfer->getSpeed() == 0 && transfer->getTransferType() != KFTPQueue::FXP)
+ speed = i18n("stalled");
+
+ if (transfer->getSpeed() == 0 && transfer->getTransferType() == KFTPQueue::FXP)
+ speed = i18n("running");
+ }
+
+ // ETA
+ QString eta;
+
+ if (transfer->isRunning() && transfer->getSpeed() > 0) {
+ eta = KIO::convertSeconds(KIO::calculateRemainingSeconds(transfer->getSize(),
+ transfer->getCompleted(),
+ transfer->getSpeed()));
+ } else {
+ eta = QString::null;
+ }
+
+ // Set the columns
+ setText(0, transfer->getSourceUrl().fileName());
+ setText(1, KIO::convertSize(transfer->getActualSize()));
+ setText(2, transfer->getSourceUrl().pathOrURL());
+ setText(3, transfer->getDestUrl().pathOrURL());
+ setText(5, speed);
+ setText(6, eta);
+
+ // Don't show the file:// for local src/dest
+ if (transfer->getSourceUrl().isLocalFile()) {
+ setText(2, transfer->getSourceUrl().path());
+ } else if (transfer->getDestUrl().isLocalFile()) {
+ setText(3, transfer->getDestUrl().path());
+ }
+
+ // Progress
+ int progress;
+ int r_progress;
+
+ if (transfer->getSize() == 0)
+ progress = 0;
+ else
+ progress = transfer->getCompleted()*100/transfer->getSize();
+
+ if (transfer->getResumed() == 0)
+ r_progress = 0;
+ else
+ r_progress = transfer->getResumed()*100/transfer->getSize();
+
+ if (transfer->getStatus() == KFTPQueue::Transfer::Waiting) {
+ // Transfer is waiting for a free connection
+ setText(4, i18n("Waiting for connection..."));
+ setPixmap(4, NULL);
+ } else if (transfer->getStatus() == KFTPQueue::Transfer::Connecting) {
+ // Transfer is not yet connected,
+ setText(4, i18n("Connecting..."));
+ setPixmap(4, NULL);
+ } else if (progress > 0) {
+ setPixmap(4, createProgressPixmap(progress, r_progress));
+
+ QString progressText;
+ progressText.sprintf("%d %%", progress);
+ setText(4, progressText);
+ } else {
+ setPixmap(4, NULL);
+ setText(4, QString::null);
+ }
+
+ // Icon
+ QString iconText;
+ if (transfer->isDir()) {
+ iconText = "folder";
+ } else {
+ KMimeType::Ptr theType = KMimeType::findByURL("/" + transfer->getSourceUrl().path(), 0, false, true);
+ iconText = theType->icon(QString::null, false);
+ }
+
+ setPixmap(0, loadSmallPixmap(iconText));
+ } else if (m_queueObject->getType() == KFTPQueue::QueueObject::Site) {
+ KFTPQueue::Site *site = static_cast<KFTPQueue::Site*>(getObject());
+
+ // Speed
+ QString speed;
+ speed.sprintf( "%lld B/s", (site->getSpeed()) );
+
+ if (site->getSpeed() > 1024)
+ speed.sprintf( "%lld KB/s", (site->getSpeed() / 1024) );
+
+ if (site->getSpeed() > 1024*1024)
+ speed.sprintf("%lld MB/s", (site->getSpeed() / 1024) / 1024);
+
+ if (site->getSpeed() == 0)
+ speed = QString::null;
+
+ // ETA
+ QString eta;
+
+ if (site->isRunning() && site->getSpeed() > 0) {
+ eta = KIO::convertSeconds(KIO::calculateRemainingSeconds(site->getSize(),
+ site->getCompleted(),
+ site->getSpeed()));
+ } else {
+ eta = "";
+ }
+
+ // Progress
+ if (site->isRunning()) {
+ int progress = 0;
+
+ if (site->getSize() > 0)
+ progress = site->getCompleted()*100/site->getSize();
+
+ setPixmap(4, createProgressPixmap(progress, 0));
+
+ QString progressText;
+ progressText.sprintf("%d %%", progress);
+ setText(4, progressText);
+ } else {
+ setPixmap(4, NULL);
+ setText(4, QString::null);
+ }
+
+ // Set the columns
+ setText(0, QString("%1:%2").arg(site->getUrl().host()).arg(site->getUrl().port()));
+ setText(1, KIO::convertSize(site->getActualSize()));
+ setText(5, speed);
+ setText(6, eta);
+
+ // Set the pixmap
+ setPixmap(0, loadSmallPixmap("server"));
+ }
+}
+
+QueueListView::QueueListView(QWidget *parent)
+ : ListView(parent)
+{
+}
+
+void QueueListView::insertItem(QListViewItem *item)
+{
+ QListViewItem *last = lastChild();
+ QListView::insertItem(item);
+
+ if (last)
+ item->moveItem(last);
+}
+
+QueueView::QueueView(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ m_toolBar = new KToolBar(this, "queueToolBar");
+ m_toolBar->setIconSize(16);
+ layout->addWidget(m_toolBar);
+
+ m_searchToolBar = new KToolBar(this, "searchToolBar");
+ m_searchToolBar->setEnableContextMenu(false);
+ m_searchToolBar->setMovingEnabled(false);
+ m_searchToolBar->setFullSize(true);
+
+ // Create the erase button
+ m_searchToolBar->insertButton(QApplication::reverseLayout() ? "clear_left" :"locationbar_erase", 0, SIGNAL(clicked()), this, SLOT(slotSearchEraseClicked()), true);
+
+ // Create the labels
+ QLabel *searchLabel = new QLabel(i18n("Filter: "), m_searchToolBar);
+ m_searchToolBar->insertWidget(1, 35, searchLabel);
+
+ // Create the list view
+ m_queue = new QueueListView(this);
+
+ // Create the search field
+ m_searchField = new KListViewSearchLine(m_searchToolBar, m_queue);
+
+ // Do some more stuff
+ m_searchToolBar->setItemAutoSized(1, true);
+ m_searchToolBar->setStretchableWidget(m_searchField);
+ m_searchToolBar->updateRects(true);
+ m_searchToolBar->hide();
+
+ layout->addWidget(m_searchToolBar);
+
+ // Create the columns
+ m_queue->addColumn(i18n("Name"), 150);
+ m_queue->addColumn(i18n("Size"), 75);
+ m_queue->addColumn(i18n("Source"), 250);
+ m_queue->addColumn(i18n("Destination"), 250);
+ m_queue->addColumn(i18n("Progress"), 140);
+ m_queue->addColumn(i18n("Speed"), 70);
+ m_queue->addColumn(i18n("ETA"), 80);
+
+ // Text when there is nothing queued
+ m_queue->setEmptyListText(i18n("You do not have any files in the queue."));
+
+ // Multi-select
+ m_queue->setSelectionModeExt(KListView::FileManager);
+ m_queue->setAllColumnsShowFocus(true);
+ m_queue->setRootIsDecorated(true);
+ m_queue->QListView::setSorting(-1);
+ m_queue->QListView::setSortColumn(-1);
+
+ layout->addWidget(m_queue);
+
+ // The signals
+ connect(m_queue, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), this,
+ SLOT(contextMenuRequested(KListView*, QListViewItem*, const QPoint&)));
+ connect(m_queue, SIGNAL(selectionChanged()), this, SLOT(updateActions()));
+
+ // Let us be up-to-date
+ connect(KFTPQueue::Manager::self(), SIGNAL(transferRemoved(long)), this, SLOT(slotObjectRemoved(long)));
+ connect(KFTPQueue::Manager::self(), SIGNAL(siteRemoved(long)), this, SLOT(slotObjectRemoved(long)));
+ connect(KFTPQueue::Manager::self(), SIGNAL(newTransfer(KFTPQueue::Transfer*)), this, SLOT(slotTransferAdded(KFTPQueue::Transfer*)));
+ connect(KFTPQueue::Manager::self(), SIGNAL(newSite(KFTPQueue::Site*)), this, SLOT(slotSiteAdded(KFTPQueue::Site*)));
+ connect(KFTPQueue::Manager::self(), SIGNAL(queueUpdate()), this, SLOT(updateActions()));
+
+ // Load the listview layout
+ loadLayout();
+
+ // Create the context menu actions
+ initActions();
+ initToolBar();
+ updateActions();
+
+ setMinimumHeight(150);
+}
+
+void QueueView::saveLayout()
+{
+ m_queue->saveLayout(kapp->config(), "queueViewLayout");
+}
+
+void QueueView::loadLayout()
+{
+ m_queue->restoreLayout(kapp->config(), "queueViewLayout");
+}
+
+void QueueView::initToolBar()
+{
+ // Plug all actions
+ m_loadAction->plug(m_toolBar);
+ m_saveAction->plug(m_toolBar);
+ m_toolBar->insertSeparator();
+ m_startAction->plug(m_toolBar);
+ m_pauseAction->plug(m_toolBar);
+ m_stopAction->plug(m_toolBar);
+ m_toolBar->insertSeparator();
+ m_addAction->plug(m_toolBar);
+ m_removeAction->plug(m_toolBar);
+ m_searchAction->plug(m_toolBar);
+ m_toolBar->insertSeparator();
+ m_filterAction->plug(m_toolBar);
+
+ // Create speed control widgets
+ m_toolBar->insertSeparator();
+
+ QSpinBox *downloadSpeed = new QSpinBox(0, 10240, 1, m_toolBar);
+ QToolTip::add(downloadSpeed, i18n("Limit download transfer speed"));
+ m_toolBar->insertWidget(1, 35, new QLabel(i18n("Down: "), m_toolBar));
+ m_toolBar->insertWidget(2, 35, downloadSpeed);
+ downloadSpeed->setValue(Config::downloadSpeedLimit());
+ connect(downloadSpeed, SIGNAL(valueChanged(int)), this, SLOT(slotDownloadLimitChanged(int)));
+
+ m_toolBar->insertSeparator();
+
+ QSpinBox *uploadSpeed = new QSpinBox(0, 10240, 1, m_toolBar);
+ QToolTip::add(uploadSpeed, i18n("Limit upload transfer speed"));
+ m_toolBar->insertWidget(3, 35, new QLabel(i18n("Up: "), m_toolBar));
+ m_toolBar->insertWidget(4, 35, uploadSpeed);
+ uploadSpeed->setValue(Config::uploadSpeedLimit());
+ connect(uploadSpeed, SIGNAL(valueChanged(int)), this, SLOT(slotUploadLimitChanged(int)));
+
+ // Create thread count control widget
+ m_toolBar->insertSeparator();
+
+ QSpinBox *threadCount = new QSpinBox(1, 10, 1, m_toolBar);
+ QToolTip::add(threadCount, i18n("Per-session transfer thread count"));
+ m_toolBar->insertWidget(5, 35, new QLabel(i18n("Threads: "), m_toolBar));
+ m_toolBar->insertWidget(6, 35, threadCount);
+ threadCount->setValue(Config::threadCount());
+ connect(threadCount, SIGNAL(valueChanged(int)), this, SLOT(slotThreadCountChanged(int)));
+}
+
+void QueueView::slotDownloadLimitChanged(int value)
+{
+ Config::setDownloadSpeedLimit(value);
+ Config::self()->emitChange();
+}
+
+void QueueView::slotUploadLimitChanged(int value)
+{
+ Config::setUploadSpeedLimit(value);
+ Config::self()->emitChange();
+}
+
+void QueueView::slotThreadCountChanged(int value)
+{
+ Config::setThreadCount(value);
+ Config::self()->emitChange();
+}
+
+void QueueView::initActions()
+{
+ m_actionCollection = new KActionCollection(this, this);
+
+ // Create all the actions
+ m_launchAction = new KAction(i18n("&Start Transfer"), "launch", KShortcut(), this, SLOT(slotLaunch()), m_actionCollection, "launch");
+ m_abortAction = new KAction(i18n("&Abort Transfer"), KShortcut(), this, SLOT(slotAbort()), m_actionCollection, "abort");
+ m_removeAction = new KAction(i18n("&Remove"), "editdelete", KShortcut(Qt::Key_Delete), this, SLOT(slotRemove()), m_actionCollection, "remove");
+ m_removeAllAction = new KAction(i18n("Remove &All"), KShortcut(), this, SLOT(slotRemoveAll()), m_actionCollection, "removeAll");
+ m_moveUpAction = new KAction(i18n("Move &Up"), "up", KShortcut(), this, SLOT(slotMoveUp()), m_actionCollection, "moveUp");
+ m_moveDownAction = new KAction(i18n("Move &Down"), "down", KShortcut("del"), this, SLOT(slotMoveDown()), m_actionCollection, "moveDown");
+ m_moveTopAction = new KAction(i18n("Move To &Top"), "top", KShortcut(), this, SLOT(slotMoveTop()), m_actionCollection, "moveTop");
+ m_moveBottomAction = new KAction(i18n("Move To &Bottom"), "bottom", KShortcut(), this, SLOT(slotMoveBottom()), m_actionCollection, "moveBottom");
+ m_editAction = new KAction(i18n("&Change Transfer Info"), KShortcut(), this, SLOT(slotEdit()), m_actionCollection, "changeTransfer");
+
+ // Create the toolbar actions
+ m_loadAction = new KAction(i18n("&Load Queue From File"), "fileopen", KShortcut(), this, SLOT(slotLoad()), m_actionCollection, "load");
+ m_saveAction = new KAction(i18n("&Save Queue to File"), "filesaveas", KShortcut(), this, SLOT(slotSave()), m_actionCollection, "save");
+ m_startAction = new KAction(i18n("S&tart"), "player_play", KShortcut(), this, SLOT(slotStart()), m_actionCollection, "start");
+ m_pauseAction = new KAction(i18n("&Pause"), "player_pause", KShortcut(), this, SLOT(slotPause()), m_actionCollection, "pause");
+ m_stopAction = new KAction(i18n("St&op"), "player_stop", KShortcut(), this, SLOT(slotStop()), m_actionCollection, "stop");
+ m_addAction = new KAction(i18n("&Add Transfer..."), "filenew", KShortcut(), this, SLOT(slotAdd()), m_actionCollection, "add");
+ m_searchAction = new KAction(i18n("&Search && Replace..."), "find", KShortcut(), this, SLOT(slotSearch()), m_actionCollection, "search");
+ m_filterAction = new KToggleAction(i18n("Show &Filter"), "filter", KShortcut(), this, SLOT(slotFilter()), m_actionCollection, "filter");
+
+ m_saveAction->setEnabled( false );
+ m_startAction->setEnabled(false);
+ m_pauseAction->setEnabled(false);
+ m_stopAction->setEnabled(false);
+ m_addAction->setEnabled(false);
+ m_removeAction->setEnabled(false);
+ m_searchAction->setEnabled(false);
+ m_filterAction->setEnabled(true);
+}
+
+void QueueView::updateActions()
+{
+ m_startAction->setEnabled(!KFTPQueue::Manager::self()->isProcessing() && KFTPQueue::Manager::self()->topLevelObject()->hasChildren() && !KFTPQueue::Manager::self()->getNumRunning());
+ m_stopAction->setEnabled(KFTPQueue::Manager::self()->isProcessing());
+ m_removeAllAction->setEnabled(!KFTPQueue::Manager::self()->isProcessing());
+
+ QPtrList<QListViewItem> selection = m_queue->selectedItems();
+ QueueViewItem *firstItem = static_cast<QueueViewItem*>(selection.first());
+
+ m_removeAction->setEnabled((bool) firstItem);
+
+ if (!firstItem || !firstItem->getObject())
+ return;
+
+ bool locked = firstItem->getObject()->isLocked();
+ bool parentRunning = false;
+
+ if (firstItem->getObject()->hasParentObject())
+ parentRunning = firstItem->getObject()->parentObject()->isRunning();
+
+ m_launchAction->setEnabled(!firstItem->getObject()->isRunning() && !KFTPQueue::Manager::self()->isProcessing() && !locked);
+ m_abortAction->setEnabled(firstItem->getObject()->isRunning() && !KFTPQueue::Manager::self()->isProcessing());
+ m_removeAction->setEnabled(!firstItem->getObject()->isRunning() && !KFTPQueue::Manager::self()->isProcessing() && !locked);
+ m_editAction->setEnabled(!firstItem->getObject()->isRunning() && firstItem->getObject()->parentObject()->getType() == KFTPQueue::QueueObject::Site && !locked);
+
+ // Only allow moving of multi selections if they have the same parent
+ bool allowMove = true;
+ for (QListViewItem *i = selection.first(); i; i = selection.next()) {
+ if (i->parent() != static_cast<QListViewItem*>(firstItem)->parent()) {
+ allowMove = false;
+ break;
+ }
+ }
+
+ m_moveUpAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedUp(firstItem->getObject()) && !locked);
+ m_moveDownAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedDown(static_cast<QueueViewItem*>(selection.last())->getObject()) && !locked);
+
+ m_moveTopAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedUp(firstItem->getObject()) && !locked);
+ m_moveBottomAction->setEnabled(allowMove && KFTPQueue::Manager::self()->canBeMovedDown(static_cast<QueueViewItem*>(selection.last())->getObject()) && !locked);
+}
+
+void QueueView::slotSiteAdded(KFTPQueue::Site *site)
+{
+ // The site should be inserted top-level
+ m_queuedItems.insert(site->getId(), new QueueViewItem(this, site, m_queue));
+ connect(site, SIGNAL(objectUpdated()), this, SLOT(slotObjectUpdated()));
+}
+
+void QueueView::slotTransferAdded(KFTPQueue::Transfer *transfer)
+{
+ // This transfer should be inserted under some other transfer
+ QueueViewItem *parent = m_queuedItems.find(transfer->parentObject()->getId());
+
+ if (parent) {
+ m_queuedItems.insert(transfer->getId(), new QueueViewItem(this, transfer, parent));
+ connect(transfer, SIGNAL(objectUpdated()), this, SLOT(slotObjectUpdated()));
+ }
+
+ // Update actions
+ m_saveAction->setEnabled(true);
+ m_removeAllAction->setEnabled(true);
+ m_searchAction->setEnabled(true);
+}
+
+void QueueView::slotObjectRemoved(long id)
+{
+ // Delete the transfer
+ QueueViewItem *item = m_queuedItems.find(id);
+
+ if (item)
+ delete item;
+
+ // Update actions
+ bool empty = (m_queue->childCount() == 0);
+
+ m_saveAction->setEnabled(!empty);
+ if (empty) m_removeAction->setEnabled(false);
+ m_removeAllAction->setEnabled(!empty);
+ m_searchAction->setEnabled(!empty);
+}
+
+void QueueView::slotObjectUpdated()
+{
+ KFTPQueue::QueueObject *object = (KFTPQueue::QueueObject*) QObject::sender();
+
+ if (object) {
+ QueueViewItem *item = m_queuedItems.find(object->getId());
+
+ if (item)
+ item->refresh();
+ }
+}
+
+void QueueView::contextMenuRequested(KListView*, QListViewItem* item, const QPoint& p)
+{
+ if (!item)
+ return;
+
+ QueueViewItem *firstItem = static_cast<QueueViewItem*>(m_queue->selectedItems().first());
+ KPopupMenu *contextMenu = new KPopupMenu(m_queue);
+
+ // Populate context menu
+ if (firstItem->getObject()->isTransfer()) {
+ contextMenu->insertTitle(item->text(0) + ((m_queue->selectedItems().count() > 1) ? "..." : "" ));
+ m_launchAction->plug(contextMenu);
+ m_abortAction->plug(contextMenu);
+ contextMenu->insertSeparator();
+ m_removeAction->plug(contextMenu);
+ m_removeAllAction->plug(contextMenu);
+ contextMenu->insertSeparator();
+ m_moveTopAction->plug(contextMenu);
+ m_moveUpAction->plug(contextMenu);
+ m_moveDownAction->plug(contextMenu);
+ m_moveBottomAction->plug(contextMenu);
+ contextMenu->insertSeparator();
+ m_editAction->plug(contextMenu);
+ } else if (firstItem->getObject()->getType() == KFTPQueue::QueueObject::Site) {
+ contextMenu->insertTitle(i18n("Site"));
+ m_launchAction->plug(contextMenu);
+ m_abortAction->plug(contextMenu);
+ contextMenu->insertSeparator();
+ m_moveUpAction->plug(contextMenu);
+ m_moveDownAction->plug(contextMenu);
+ }
+
+ // Update the actions
+ updateActions();
+
+ // Show the context menu
+ contextMenu->exec(p);
+}
+
+void QueueView::slotLaunch()
+{
+ // Reset a possible preconfigured default action
+ KFTPQueue::Manager::self()->setDefaultFileExistsAction();
+
+ static_cast<QueueViewItem*>(m_queue->selectedItems().first())->getObject()->execute();
+}
+
+void QueueView::slotAbort()
+{
+ static_cast<QueueViewItem*>(m_queue->selectedItems().first())->getObject()->abort();
+}
+
+void QueueView::slotRemove()
+{
+ if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove queued file(s)?")) == KMessageBox::Yes) {
+ KFTPQueue::Manager::self()->setEmitUpdate(false);
+
+ QPtrList<QListViewItem> selection = m_queue->selectedItems();
+ for (QListViewItem *item = selection.first(); item; item = selection.next()) {
+ if (item && static_cast<QueueViewItem*>(item)->getObject())
+ KFTPQueue::Manager::self()->removeTransfer(static_cast<KFTPQueue::Transfer*>(static_cast<QueueViewItem*>(item)->getObject()));
+ }
+
+ KFTPQueue::Manager::self()->setEmitUpdate(true);
+ KFTPQueue::Manager::self()->doEmitUpdate();
+ }
+}
+
+void QueueView::slotRemoveAll()
+{
+ if (KMessageBox::questionYesNo(this, i18n("Are you sure you want to remove ALL queued files?")) == KMessageBox::Yes) {
+ KFTPQueue::Manager::self()->clearQueue();
+ }
+}
+
+void QueueView::slotMoveUp()
+{
+ QPtrList<QListViewItem> selection = m_queue->selectedItems();
+
+ for (QListViewItem *item = selection.first(); item; item = selection.next()) {
+ QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
+
+ // Move the transfer
+ KFTPQueue::Manager::self()->moveTransferUp(queueItem->getObject());
+ queueItem->moveUp();
+ }
+}
+
+void QueueView::slotMoveDown()
+{
+ QPtrList<QListViewItem> selection = m_queue->selectedItems();
+
+ for (QListViewItem *item = selection.last(); item; item = selection.prev()) {
+ QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
+
+ // Move the transfer
+ KFTPQueue::Manager::self()->moveTransferDown(queueItem->getObject());
+ queueItem->moveDown();
+ }
+}
+
+void QueueView::slotMoveTop()
+{
+ QPtrList<QListViewItem> selection = m_queue->selectedItems();
+
+ for (QListViewItem *item = selection.last(); item; item = selection.prev()) {
+ QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
+
+ // Move the transfer
+ KFTPQueue::Manager::self()->moveTransferTop(queueItem->getObject());
+ queueItem->moveToTop();
+ }
+}
+
+void QueueView::slotMoveBottom()
+{
+ QPtrList<QListViewItem> selection = m_queue->selectedItems();
+
+ for (QListViewItem *item = selection.first(); item; item = selection.next()) {
+ QueueViewItem *queueItem = static_cast<QueueViewItem*>(item);
+
+ // Move the transfer
+ KFTPQueue::Manager::self()->moveTransferBottom(queueItem->getObject());
+ queueItem->moveToBottom();
+ }
+}
+
+void QueueView::slotEdit()
+{
+ QueueEditor *editor = new QueueEditor(this);
+
+ QueueViewItem* item = static_cast<QueueViewItem*>(m_queue->selectedItems().first());
+ editor->setData(static_cast<KFTPQueue::Transfer*>(item->getObject()));
+
+ // Show the queue editor
+ if (editor->exec() == QDialog::Accepted) {
+ editor->saveData();
+
+ KFTPQueue::Manager::self()->revalidateTransfer(static_cast<KFTPQueue::Transfer*>(item->getObject()));
+ KFTPQueue::Manager::self()->doEmitUpdate();
+ item->refresh();
+ }
+}
+
+void QueueView::slotSearch()
+{
+ SearchDialog *dialog = new SearchDialog();
+
+ dialog->exec();
+ delete dialog;
+}
+
+void QueueView::slotLoad()
+{
+ if (m_queue->childCount() && KMessageBox::warningContinueCancel(0L, i18n("Loading a new queue will overwrite the existing one; are you sure you want to continue?"), i18n("Load Queue")) == KMessageBox::Cancel)
+ return;
+
+ QString loadPath = KFileDialog::getOpenFileName();
+
+ if (!loadPath.isEmpty()) {
+ KFTPQueue::Manager::self()->getConverter()->importQueue(loadPath);
+ }
+}
+
+void QueueView::slotSave()
+{
+ QString savePath = KFileDialog::getSaveFileName();
+
+ if (!savePath.isEmpty()) {
+ KFTPQueue::Manager::self()->getConverter()->exportQueue(savePath);
+ }
+}
+
+void QueueView::slotStart()
+{
+ // Begin queue processing
+ KFTPQueue::Manager::self()->start();
+}
+
+void QueueView::slotPause()
+{
+}
+
+void QueueView::slotStop()
+{
+ // Abort queue processing
+ KFTPQueue::Manager::self()->abort();
+}
+
+void QueueView::slotAdd()
+{
+}
+
+void QueueView::slotSearchEraseClicked()
+{
+ m_searchField->clear();
+}
+
+void QueueView::slotFilter()
+{
+ if (m_filterAction->isChecked())
+ m_searchToolBar->show();
+ else
+ m_searchToolBar->hide();
+}
+
+}
+
+#include "queueview.moc"
diff --git a/kftpgrabber/src/widgets/queueview/queueview.h b/kftpgrabber/src/widgets/queueview/queueview.h
new file mode 100644
index 0000000..d93e14f
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/queueview.h
@@ -0,0 +1,296 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2005 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPQUEUEVIEW_H
+#define KFTPQUEUEVIEW_H
+
+#include <qguardedptr.h>
+#include <qintdict.h>
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <kaction.h>
+#include <klistview.h>
+
+#include "kftpqueue.h"
+
+class KToolBar;
+class KListViewSearchLine;
+
+namespace KFTPWidgets {
+
+class ListView;
+class QueueView;
+
+/**
+ * A visual representation of a queued object.
+ */
+class QueueViewItem : public QListViewItem
+{
+public:
+ /**
+ * Class constructor.
+ *
+ * @param view Queue view widget
+ * @param object Queue object
+ * @param parent Parent list view
+ */
+ QueueViewItem(QueueView *view, KFTPQueue::QueueObject *object, QListView *parent);
+
+ /**
+ * Class constructor.
+ *
+ * @param view Queue view widget
+ * @param object Queue object
+ * @param parent Parent item
+ */
+ QueueViewItem(QueueView *view, KFTPQueue::QueueObject *object, QListViewItem *parent);
+
+ /**
+ * Class destructor.
+ */
+ ~QueueViewItem();
+
+ /**
+ * Refresh the visual representation with data from the actual queue object.
+ */
+ void refresh();
+
+ /**
+ * Associate a queue object with this item.
+ *
+ * @param object A valid object pointer
+ */
+ void setObject(KFTPQueue::QueueObject *object) { m_queueObject = object; }
+
+ /**
+ * Returns the currently associated queue object.
+ */
+ KFTPQueue::QueueObject *getObject() const { return m_queueObject; }
+
+ /**
+ * Returns the last child item.
+ */
+ QListViewItem *lastChild() const { return m_lastChild; }
+
+ /**
+ * Moves this item one position up.
+ */
+ void moveUp();
+
+ /**
+ * Moves this item one position down.
+ */
+ void moveDown();
+
+ /**
+ * Moves this item to parent's top.
+ */
+ void moveToTop();
+
+ /**
+ * Moves this item to parent's bottom.
+ */
+ void moveToBottom();
+
+ /**
+ * @overload
+ * Reimplemented from QListViewItem.
+ */
+ void insertItem(QListViewItem *newChild);
+
+ /**
+ * @overload
+ * Reimplemented from QListViewItem.
+ */
+ void takeItem(QListViewItem *item);
+
+ /**
+ * @overload
+ * Reimplemented from QListViewItem for text colors.
+ */
+ void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment);
+
+ /**
+ * @overload
+ * Reimplemented from QListViewItem.
+ */
+ void sortChildItems(int, bool) {}
+protected:
+ /**
+ * Init the item.
+ */
+ void init();
+private:
+ QListViewItem *m_lastChild;
+
+ KFTPQueue::QueueObject *m_queueObject;
+ QueueView *m_queueView;
+ long m_queueId;
+};
+
+/**
+ * The list view widget.
+ *
+ * @author Jernej Kos
+ */
+class QueueListView : public ListView {
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ */
+ QueueListView(QWidget *parent);
+
+ /**
+ * @overload
+ * Reimplemented from QListView.
+ */
+ void insertItem(QListViewItem *item);
+
+ /**
+ * @overload
+ * Reimplemented from QListView.
+ */
+ void setSorting(int, bool = true) { QListView::setSorting(-1); }
+};
+
+/**
+ * A widget for displaying and manipulating the current queue.
+ *
+ * @author Jernej Kos
+ */
+class QueueView : public QWidget
+{
+friend class QueueViewItem;
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ */
+ QueueView(QWidget *parent, const char *name);
+
+ /**
+ * Load queue list layout from the configuration file.
+ */
+ void loadLayout();
+
+ /**
+ * Save queue list layout to the configuration file.
+ */
+ void saveLayout();
+public slots:
+ void updateActions();
+protected:
+ /**
+ * Initialize actions.
+ */
+ void initActions();
+
+ /**
+ * Initialize toolbar widgets.
+ */
+ void initToolBar();
+private:
+ KActionCollection *m_actionCollection;
+
+ // Actions
+ KAction *m_launchAction;
+ KAction *m_abortAction;
+ KAction *m_removeAction;
+ KAction *m_removeAllAction;
+ KAction *m_moveUpAction;
+ KAction *m_moveDownAction;
+ KAction *m_moveTopAction;
+ KAction *m_moveBottomAction;
+ KAction *m_editAction;
+
+ // Toolbar Actions
+ KAction *m_loadAction;
+ KAction *m_saveAction;
+ KAction *m_startAction;
+ KAction *m_pauseAction;
+ KAction *m_stopAction;
+ KAction *m_addAction;
+ KAction *m_searchAction;
+ KToggleAction *m_filterAction;
+
+ KListViewSearchLine *m_searchField;
+
+ KToolBar *m_toolBar;
+ KToolBar *m_searchToolBar;
+ QueueListView *m_queue;
+
+ QIntDict<QueueViewItem> m_queuedItems;
+private slots:
+ void slotObjectRemoved(long);
+ void slotObjectUpdated();
+ void slotTransferAdded(KFTPQueue::Transfer*);
+ void slotSiteAdded(KFTPQueue::Site*);
+
+ void contextMenuRequested(KListView*, QListViewItem*, const QPoint&);
+
+ void slotSearchEraseClicked();
+
+ // Slots for actions
+ void slotLaunch();
+ void slotAbort();
+ void slotRemove();
+ void slotRemoveAll();
+ void slotMoveUp();
+ void slotMoveDown();
+ void slotMoveTop();
+ void slotMoveBottom();
+ void slotEdit();
+
+ void slotLoad();
+ void slotSave();
+ void slotStart();
+ void slotPause();
+ void slotStop();
+ void slotAdd();
+ void slotSearch();
+ void slotFilter();
+
+ void slotDownloadLimitChanged(int value);
+ void slotUploadLimitChanged(int value);
+ void slotThreadCountChanged(int value);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/queueview/threadview.cpp b/kftpgrabber/src/widgets/queueview/threadview.cpp
new file mode 100644
index 0000000..fd1c663
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/threadview.cpp
@@ -0,0 +1,202 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "threadview.h"
+#include "kftpapi.h"
+
+#include "listview.h"
+
+#include <qlayout.h>
+#include <klocale.h>
+
+namespace KFTPWidgets {
+
+ThreadViewItem::ThreadViewItem(KFTPSession::Session *session, QListView *parent)
+ : QObject(parent),
+ QListViewItem(parent),
+ m_connection(0),
+ m_session(session)
+{
+ refresh();
+}
+
+ThreadViewItem::ThreadViewItem(KFTPSession::Connection *conn, QListViewItem *parent, int id)
+ : QObject(),
+ QListViewItem(parent),
+ m_id(id),
+ m_connection(conn),
+ m_session(0)
+{
+ connect(conn, SIGNAL(connectionRemoved()), this, SLOT(slotUpdateItemRequested()));
+ connect(conn, SIGNAL(connectionLost(KFTPSession::Connection*)), this, SLOT(slotUpdateItemRequested()));
+ connect(conn, SIGNAL(connectionEstablished()), this, SLOT(slotUpdateItemRequested()));
+
+ // Connect the transfer signals if the transfer is already present
+ KFTPQueue::Transfer *transfer = m_connection->getTransfer();
+ if (transfer) {
+ connect(transfer, SIGNAL(objectUpdated()), this, SLOT(slotUpdateItemRequested()));
+ } else {
+ connect(conn, SIGNAL(connectionAcquired()), this, SLOT(slotConnectionAcquired()));
+ }
+
+ refresh();
+}
+
+void ThreadViewItem::slotConnectionAcquired()
+{
+ if (!m_connection->getTransfer())
+ return;
+
+ connect(m_connection->getTransfer(), SIGNAL(objectUpdated()), this, SLOT(slotUpdateItemRequested()));
+ refresh();
+}
+
+void ThreadViewItem::refresh()
+{
+ if (m_session) {
+ // Set the columns
+ setText(0, i18n("Site session [%1]").arg(m_session->getClient()->socket()->getCurrentUrl().host()));
+ setPixmap(0, loadSmallPixmap("ftp"));
+ } else if (m_connection) {
+ setText(0, i18n("Thread %1").arg(m_id));
+ setPixmap(0, loadSmallPixmap("server"));
+ setText(1, m_connection->isConnected() ? i18n("idle") : i18n("disconnected"));
+ setText(2, "");
+
+ KFTPQueue::Transfer *transfer = m_connection->getTransfer();
+ if (transfer && transfer->isRunning()) {
+ QString speed;
+ filesize_t rawSpeed = transfer->getSpeed();
+
+ speed.sprintf( "%lld KB/s", (rawSpeed / 1024) );
+
+ if (rawSpeed > 1024*1024)
+ speed.sprintf("%lld MB/s", (rawSpeed / 1024) / 1024);
+ else if (rawSpeed == 0)
+ speed = "";
+
+ if (transfer->getStatus() == KFTPQueue::Transfer::Connecting) {
+ setText(1, i18n("connecting"));
+ } else {
+ setText(1, i18n("transferring"));
+ }
+
+ if (transfer->getTransferType() == KFTPQueue::FXP && rawSpeed == 0) {
+ KFTPSession::Connection *c = static_cast<KFTPQueue::TransferFile*>(transfer)->getOppositeConnection(m_connection);
+
+ setText(2, i18n("FXP - [%1]").arg(c->getUrl().host()));
+ } else {
+ setText(2, speed);
+ }
+ }
+ }
+}
+
+void ThreadViewItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment)
+{
+ QListViewItem::paintCell(p, cg, column, width, alignment);
+}
+
+void ThreadViewItem::slotUpdateItemRequested()
+{
+ refresh();
+}
+
+KActionCollection *ThreadView::actionCollection()
+{
+ return KFTPAPI::getInstance()->mainWindow()->actionCollection();
+}
+
+ThreadView::ThreadView(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ // Create the list view
+ m_threads = new KFTPWidgets::ListView(this);
+
+ // Create the columns
+ m_threads->addColumn(i18n("Name"), 400);
+ m_threads->addColumn(i18n("Status"), 120);
+ m_threads->addColumn(i18n("Speed"), 70);
+
+ // Text when there are no threads
+ m_threads->setEmptyListText(i18n("There are no threads currently running."));
+
+ // Multi-select
+ m_threads->setSelectionModeExt(KListView::FileManager);
+ m_threads->setAllColumnsShowFocus(true);
+ m_threads->setRootIsDecorated(true);
+
+ layout->addWidget(m_threads);
+
+ connect(KFTPSession::Manager::self(), SIGNAL(update()), this, SLOT(slotUpdateSessions()));
+}
+
+ThreadView::~ThreadView()
+{
+}
+
+void ThreadView::slotUpdateSessions()
+{
+ KFTPSession::SessionList *list = KFTPSession::Manager::self()->getSessionList();
+ KFTPSession::Session *i;
+
+ m_threads->clear();
+
+ for (i = list->first(); i; i = list->next()) {
+ if (i->isRemote()) {
+ ThreadViewItem *site = new ThreadViewItem(i, m_threads);
+
+ QPtrList<KFTPSession::Connection> *c_list = i->getConnectionList();
+
+ if (c_list->count() > 0) {
+ KFTPSession::Connection *conn;
+ int id = 0;
+
+ for (conn = c_list->first(); conn; conn = c_list->next()) {
+ new ThreadViewItem(conn, site, ++id);
+ }
+
+ site->setOpen(true);
+ }
+ }
+ }
+}
+
+}
+
+#include "threadview.moc"
+
diff --git a/kftpgrabber/src/widgets/queueview/threadview.h b/kftpgrabber/src/widgets/queueview/threadview.h
new file mode 100644
index 0000000..5c37e6c
--- /dev/null
+++ b/kftpgrabber/src/widgets/queueview/threadview.h
@@ -0,0 +1,93 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPTHREADVIEW_H
+#define KFTPTHREADVIEW_H
+
+#include <qguardedptr.h>
+
+#include <kaction.h>
+#include <klistview.h>
+
+#include "kftpsession.h"
+
+class KToolBar;
+
+namespace KFTPWidgets {
+
+class ListView;
+
+class ThreadViewItem : public QObject, public QListViewItem
+{
+Q_OBJECT
+public:
+ ThreadViewItem(KFTPSession::Session *session, QListView *parent);
+ ThreadViewItem(KFTPSession::Connection *conn, QListViewItem *parent, int id);
+
+ void refresh();
+ virtual void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int alignment);
+private:
+ int m_id;
+
+ QGuardedPtr<KFTPSession::Connection> m_connection;
+ QGuardedPtr<KFTPSession::Session> m_session;
+private slots:
+ void slotConnectionAcquired();
+ void slotUpdateItemRequested();
+};
+
+/**
+ * This widget shows all the currently used threads in KFTPGrabber transfers.
+ *
+ * @author Jernej Kos
+ */
+class ThreadView : public QWidget
+{
+Q_OBJECT
+public:
+ ThreadView(QWidget *parent = 0, const char *name = 0);
+ ~ThreadView();
+
+ KActionCollection *actionCollection();
+
+private slots:
+ void slotUpdateSessions();
+private:
+ KFTPWidgets::ListView *m_threads;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/quickconnect.cpp b/kftpgrabber/src/widgets/quickconnect.cpp
new file mode 100644
index 0000000..0eabdc8
--- /dev/null
+++ b/kftpgrabber/src/widgets/quickconnect.cpp
@@ -0,0 +1,476 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "widgets/quickconnect.h"
+#include "bookmarks/editortls.h"
+#include "misc/config.h"
+#include "kftpbookmarks.h"
+#include "misc.h"
+
+#include "engine/thread.h"
+#include "engine/ftpsocket.h"
+
+#include <kglobal.h>
+#include <kcharsets.h>
+#include <kcombobox.h>
+#include <klocale.h>
+#include <klineedit.h>
+#include <kpassdlg.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+
+/* KSSL includes */
+#include <ksslpkcs12.h>
+
+#include <qcheckbox.h>
+#include <qspinbox.h>
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+QuickConnectDialog::QuickConnectDialog(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n("Quick Connect"), Ok|Cancel, Ok),
+ m_noUrlChange(false),
+ m_protocolAdvancedDialog(0L),
+ m_portChanged(false)
+{
+ // Create the main widget
+ m_layout = new KFTPQuickConnectLayout(this);
+
+ // Set the dialog options
+ setMainWidget(m_layout);
+ resize(QSize(200,300));
+
+ m_layout->clearRecent->setIconSet(loadSmallIcon("clear_left"));
+ m_layout->protoAdvanced->setIconSet(loadSmallIcon("configure"));
+
+ // Connect the slots
+ connect(m_layout->urlBox, SIGNAL(textChanged(const QString&)), this, SLOT(slotUrlChanged(const QString &)));
+ connect(m_layout->hostBox, SIGNAL(textChanged(const QString&)), this, SLOT(slotHostChanged(const QString&)));
+ connect(m_layout->protocolBox, SIGNAL(activated(int)), this, SLOT(slotProtocolChanged(int)));
+ connect(m_layout->protoAdvanced, SIGNAL(clicked()), this, SLOT(slotProtoAdvancedClicked()));
+ connect(m_layout->usernameBox, SIGNAL(textChanged(const QString&)), this, SLOT(slotUserChanged()));
+ connect(m_layout->passwordBox, SIGNAL(textChanged(const QString&)), this, SLOT(slotPassChanged()));
+ connect(m_layout->portBox, SIGNAL(valueChanged(int)), this, SLOT(slotPortChanged(int)));
+ connect(m_layout->anonLogin, SIGNAL(clicked()), this, SLOT(slotAnonClicked()));
+ connect(m_layout->recentConnections, SIGNAL(activated(int)), this, SLOT(slotRecentConnectionActivated(int)));
+ connect(m_layout->clearRecent, SIGNAL(clicked()), this, SLOT(slotClearRecentClicked()));
+
+ // Init url
+ m_url.setProtocol("ftp");
+ m_url.setPort(21);
+ m_url.setPath("/");
+ m_layout->urlBox->setURL(m_url);
+
+ // Use anonymous account by default
+ m_layout->anonLogin->setChecked(true);
+ slotAnonClicked();
+
+ // Init the protocol advanced button
+ m_layout->protoAdvanced->setEnabled(false);
+
+ // Populate charsets
+ QStringList charsets = KGlobal::charsets()->descriptiveEncodingNames();
+ m_layout->serverEncoding->insertStringList(charsets);
+
+ QString defEncoding = KFTPCore::Config::defEncoding();
+ defEncoding = QString("%1 ( %2 )").arg(KGlobal::charsets()->languageForEncoding(defEncoding)).arg(defEncoding);
+ m_layout->serverEncoding->setCurrentText(defEncoding);
+
+ // Populate recent sites
+ int index = 0;
+ QStringList recentSites = KFTPCore::Config::recentSites();
+ for (QStringList::Iterator i = recentSites.begin(); i != recentSites.end(); ++i) {
+ KURL siteUrl = KURL(*i);
+
+ m_recentSites[index] = siteUrl;
+ m_layout->recentConnections->insertItem(siteUrl.prettyURL(), index++);
+ }
+
+ slotRecentConnectionActivated(0);
+}
+
+QuickConnectDialog::~QuickConnectDialog()
+{
+ if (m_protocolAdvancedDialog)
+ delete m_protocolAdvancedDialog;
+}
+
+void QuickConnectDialog::slotRecentConnectionActivated(int index)
+{
+ KURL url = m_recentSites[index];
+ m_layout->urlBox->setText(url.url());
+
+ if (m_url.user() == "anonymous") {
+ m_layout->anonLogin->setChecked(true);
+ slotAnonClicked();
+ }
+}
+
+void QuickConnectDialog::slotClearRecentClicked()
+{
+ if (KMessageBox::questionYesNo(0, i18n("Clear list of recently accessed sites ?")) == KMessageBox::No)
+ return;
+
+ m_layout->recentConnections->clear();
+ m_recentSites.clear();
+ KFTPCore::Config::setRecentSites(QStringList());
+}
+
+void QuickConnectDialog::slotUrlChanged(const QString &text)
+{
+ if (m_noUrlChange)
+ return;
+
+ m_layout->anonLogin->setChecked(false);
+ m_layout->usernameBox->setEnabled(true);
+ m_layout->passwordBox->setEnabled(true);
+
+ KURL tmpUrl = text;
+ if (!tmpUrl.isValid())
+ return;
+ else
+ m_url = tmpUrl;
+
+ m_noUrlChange = true;
+
+ if (m_url.protocol() == "ftp")
+ m_layout->protocolBox->setCurrentItem(SP_FTP);
+ else if (m_url.protocol() == "sftp")
+ m_layout->protocolBox->setCurrentItem(SP_SFTP);
+ else {
+ // Force FTP protocol
+ m_url.setProtocol("ftp");
+ m_layout->protocolBox->setCurrentItem(SP_FTP);
+ }
+
+ m_layout->hostBox->setText(m_url.host());
+ m_layout->usernameBox->setText(m_url.user());
+
+ if (m_url.hasPass()) {
+ m_layout->passwordBox->erase();
+ m_layout->passwordBox->insert(m_url.pass());
+ }
+
+ if (m_url.port() == 0) {
+ switch (m_layout->protocolBox->currentItem()) {
+ case SP_SFTP: {
+ m_layout->portBox->setValue(22);
+ m_url.setPort(22);
+ break;
+ }
+ default: {
+ m_layout->portBox->setValue(21);
+ m_url.setPort(21);
+ break;
+ }
+ }
+ } else {
+ m_layout->portBox->setValue(m_url.port());
+ }
+
+ m_layout->urlBox->setText(m_url.prettyURL());
+ m_noUrlChange = false;
+}
+
+void QuickConnectDialog::slotHostChanged(const QString &text)
+{
+ if (m_noUrlChange) return;
+
+ m_noUrlChange = true;
+ m_url.setHost(text);
+ m_layout->urlBox->setURL(m_url);
+ m_noUrlChange = false;
+}
+
+void QuickConnectDialog::slotPortChanged(int port)
+{
+ if (m_noUrlChange) return;
+
+ m_noUrlChange = true;
+ m_url.setPort(port);
+ m_layout->urlBox->setURL(m_url);
+ m_portChanged = true;
+ m_noUrlChange = false;
+}
+
+void QuickConnectDialog::slotUserChanged()
+{
+ if (m_noUrlChange) return;
+
+ m_noUrlChange = true;
+ m_url.setUser(m_layout->usernameBox->text());
+ m_layout->urlBox->setURL(m_url);
+ m_noUrlChange = false;
+}
+
+void QuickConnectDialog::slotPassChanged()
+{
+ if (m_noUrlChange) return;
+
+ m_noUrlChange = true;
+ m_url.setPass(m_layout->passwordBox->password());
+ m_layout->urlBox->setURL(m_url);
+ m_noUrlChange = false;
+}
+
+void QuickConnectDialog::slotAnonClicked()
+{
+ static QString tmpUser, tmpPass;
+
+ if (m_layout->anonLogin->isChecked()) {
+ m_layout->usernameBox->setEnabled(false);
+ m_layout->passwordBox->setEnabled(false);
+ tmpUser = m_layout->usernameBox->text();
+ tmpPass = m_layout->passwordBox->text();
+ m_layout->usernameBox->setText("anonymous");
+ m_layout->passwordBox->erase();
+
+ // Use the appropriate e-mail address for anonymous accounts
+ if (!KFTPCore::Config::anonMail().isEmpty())
+ m_layout->passwordBox->insert(KFTPCore::Config::anonMail());
+ else
+ m_layout->passwordBox->insert("userlogin@anonymo.us");
+ } else {
+ m_layout->usernameBox->setText(tmpUser);
+ m_layout->passwordBox->erase();
+ m_layout->passwordBox->insert(tmpPass);
+ m_layout->usernameBox->setEnabled(true);
+ m_layout->passwordBox->setEnabled(true);
+ }
+
+ slotUserChanged();
+ slotPassChanged();
+}
+
+void QuickConnectDialog::slotOk()
+{
+ // Construct a nice error message
+ QString errorMessage;
+
+ if (m_url.host().isEmpty())
+ errorMessage = i18n("a hostname");
+
+ if (m_url.port() < 1)
+ errorMessage += (errorMessage.isEmpty() ? QString::null : QString::fromLatin1(", ")) + i18n("a valid port");
+
+ if (m_url.user().isEmpty())
+ errorMessage += (errorMessage.isEmpty() ? QString::null : QString::fromLatin1(", ")) + i18n("your username");
+
+ if (m_url.pass().isEmpty())
+ errorMessage += (errorMessage.isEmpty() ? QString::null : QString::fromLatin1(", ")) + i18n("your password");
+
+ if (errorMessage.findRev(",") != -1)
+ errorMessage = errorMessage.replace(errorMessage.findRev(","), 1 , i18n(" and"));
+
+ if (!errorMessage.isEmpty()) {
+ KMessageBox::sorry(0, i18n("Please enter ") + errorMessage + ".");
+ return;
+ }
+
+ if (m_layout->addBookmark->isChecked()) {
+ // Add the current connection to bookmarks. Use hostname as the bookmark name.
+ KFTPBookmarks::Site *root = KFTPBookmarks::Manager::self()->findCategory("root");
+ KFTPBookmarks::Site *site = root->addSite();
+ site->setAttribute("name", m_url.host());
+
+ site->setProperty("host", m_url.host());
+ site->setProperty("port", m_url.port());
+ site->setProperty("username", m_url.user());
+ site->setProperty("password", encodePassword(m_url.pass()));
+ site->setProperty("defremotepath", "/");
+ site->setProperty("protocol", m_layout->protocolBox->currentItem() == SP_SFTP ? "sftp" : "ftp");
+ site->setProperty("use_tls", m_layout->protocolBox->currentItem() == SP_SSL_EXPLICIT);
+ site->setProperty("use_implicit", m_layout->protocolBox->currentItem() == SP_SSL_IMPLICIT);
+ site->setProperty("encoding", KGlobal::charsets()->encodingForName(m_layout->serverEncoding->currentText()));
+
+ // Save TLS options
+ if (m_protocolAdvancedDialog) {
+ site->setProperty("tls_data_mode", m_protocolAdvancedDialog->getTLSMode());
+ site->setProperty("use_cert", m_protocolAdvancedDialog->isCertChecked());
+
+ if (m_protocolAdvancedDialog->isCertChecked())
+ site->setProperty("tls_cert_path", m_protocolAdvancedDialog->getCertPath());
+ }
+
+ KFTPBookmarks::Manager::self()->emitUpdate();
+ }
+
+ // Save to recent sites
+ QStringList recentSites = KFTPCore::Config::recentSites();
+ if (m_url.user() == "anonymous")
+ m_url.setPass("");
+
+ if (recentSites.findIndex(m_url.url()) == -1) {
+ recentSites.prepend(m_url.url());
+
+ if (recentSites.count() > 10)
+ recentSites.pop_back();
+
+ KFTPCore::Config::setRecentSites(recentSites);
+ }
+
+ // Close the dialog
+ accept();
+}
+
+void QuickConnectDialog::setupClient(KFTPEngine::Thread *client)
+{
+ // First activate the correct socket and reset the old flags
+ client->selectSocketForProtocol(KURL(QString("%1://test/").arg(m_layout->protocolBox->currentItem() == SP_SFTP ? "sftp" : "ftp")));
+ client->socket()->initConfig();
+
+ client->socket()->setConfig("retry", 0);
+
+ client->socket()->setConfig("ssl.use_tls", m_layout->protocolBox->currentItem() == SP_SSL_EXPLICIT);
+ client->socket()->setConfig("ssl.use_implicit", m_layout->protocolBox->currentItem() == SP_SSL_IMPLICIT);
+ client->socket()->setConfig("encoding", KGlobal::charsets()->encodingForName(m_layout->serverEncoding->currentText()));
+
+ // Set TLS options
+ if (m_protocolAdvancedDialog) {
+ client->socket()->setConfig("ssl.prot_mode", m_protocolAdvancedDialog->getTLSMode());
+
+ // Should we use a X509 certificate ?
+ if (m_protocolAdvancedDialog->isCertChecked() && m_layout->protocolBox->currentItem() == SP_FTP) {
+ // Ask the user for the decryption password
+ QCString certPass;
+ KPasswordDialog::getPassword(certPass, i18n("Please provide your X509 certificate decryption password."));
+
+ static_cast<KFTPEngine::FtpSocket*>(client->socket())->setSslClientCertificate(KSSLPKCS12::loadCertFile(m_protocolAdvancedDialog->getCertPath(), certPass));
+ }
+ }
+}
+
+void QuickConnectDialog::slotProtocolChanged(int item)
+{
+ if (m_noUrlChange) return;
+
+ // Enable/Disable the SSL/TLS settings if needed
+ m_layout->protoAdvanced->setEnabled( item == SP_SSL_EXPLICIT || item == SP_SSL_IMPLICIT );
+
+ // Set the default port
+ if (!m_portChanged) {
+ switch (item) {
+ case SP_SSL_IMPLICIT:
+ if (m_layout->portBox->value() == 21 || m_layout->portBox->value() == 22)
+ m_layout->portBox->setValue(993);
+ break;
+ case SP_SFTP:
+ if (m_layout->portBox->value() == 21 || m_layout->portBox->value() == 993)
+ m_layout->portBox->setValue(22);
+ break;
+ default:
+ if (m_layout->portBox->value() == 22 || m_layout->portBox->value() == 993)
+ m_layout->portBox->setValue(21);
+ break;
+ }
+
+ m_portChanged = false;
+ }
+
+ m_noUrlChange = true;
+ m_url.setProtocol( item == SP_SFTP ? "sftp" : "ftp");
+ m_url.setPort( m_layout->portBox->value() );
+ m_layout->urlBox->setURL(m_url);
+ m_noUrlChange = false;
+}
+
+void QuickConnectDialog::slotProtoAdvancedClicked()
+{
+ if (!m_protocolAdvancedDialog)
+ m_protocolAdvancedDialog = new KFTPWidgets::Bookmarks::BookmarkEditorTLS(this);
+
+ QChar tlsMode = m_protocolAdvancedDialog->getTLSMode();
+ bool certChecked = m_protocolAdvancedDialog->isCertChecked();
+ QString certPath = m_protocolAdvancedDialog->getCertPath();
+ m_protocolAdvancedDialog->slotChangeActiveX509Group();
+
+ if (!m_protocolAdvancedDialog->exec()) {
+ m_protocolAdvancedDialog->setTLSMode(tlsMode);
+ m_protocolAdvancedDialog->setCertChecked(certChecked);
+ m_protocolAdvancedDialog->setCertPath(certPath);
+ m_protocolAdvancedDialog->slotChangeActiveX509Group();
+ }
+}
+
+QChar QuickConnectDialog::getTLSMode()
+{
+ if (!m_protocolAdvancedDialog)
+ return false;
+
+ return m_protocolAdvancedDialog->getTLSMode();
+}
+
+bool QuickConnectDialog::isCertChecked()
+{
+ if (!m_protocolAdvancedDialog)
+ return false;
+
+ return m_protocolAdvancedDialog->isCertChecked();
+}
+
+QString QuickConnectDialog::getCertPath()
+{
+ if (!m_protocolAdvancedDialog)
+ return QString::null;
+
+ return m_protocolAdvancedDialog->getCertPath();
+}
+
+int QuickConnectDialog::getFTPMode()
+{
+ return m_layout->protocolBox->currentItem();
+}
+
+void QuickConnectDialog::setHost(const QString &host)
+{
+ m_layout->hostBox->setText(host);
+}
+
+void QuickConnectDialog::setPort(int port)
+{
+ m_layout->portBox->setValue(port);
+}
+
+void QuickConnectDialog::setFocusToUser()
+{
+ m_layout->usernameBox->setFocus();
+}
+
+}
+
+#include "quickconnect.moc"
diff --git a/kftpgrabber/src/widgets/quickconnect.h b/kftpgrabber/src/widgets/quickconnect.h
new file mode 100644
index 0000000..ad88212
--- /dev/null
+++ b/kftpgrabber/src/widgets/quickconnect.h
@@ -0,0 +1,162 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004 Markus Brueffer <markus@brueffer.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSQUICKCONNECT_H
+#define KFTPWIDGETSQUICKCONNECT_H
+
+#include "kftpquickconnectlayout.h"
+
+#include <qmap.h>
+
+#include <kdialogbase.h>
+#include <kurl.h>
+
+namespace KFTPEngine {
+ class Thread;
+}
+
+namespace KFTPWidgets {
+
+namespace Bookmarks {
+ class BookmarkEditorTLS;
+}
+
+/**
+ * @author Jernej Kos
+ */
+class QuickConnectDialog : public KDialogBase
+{
+Q_OBJECT
+public:
+ QuickConnectDialog(QWidget *parent = 0, const char *name = 0);
+ ~QuickConnectDialog();
+
+ /**
+ * Get URL the user is trying to connect to.
+ *
+ * @return a KURL representing the destination server
+ */
+ KURL getUrl() { return m_url; }
+
+ /**
+ * Get the currently selected file transfer protocol.
+ *
+ * @return index of currently selected protocol
+ */
+ int getFTPMode();
+
+ /**
+ * Get the currently set TLS operation mode.
+ *
+ * @return currently set TLS operation mode
+ */
+ QChar getTLSMode();
+
+ /**
+ * Is the "use custom X509 certificate" checked or not.
+ *
+ * @return true if the "use custom X509 certificate" is checked
+ */
+ bool isCertChecked();
+
+ /**
+ * Get the currently set X509 certificate path.
+ *
+ * @return path to the user's X509 certificate for this connection
+ */
+ QString getCertPath();
+
+ /**
+ * Set the destination server's hostname.
+ *
+ * @param host destination server's hostname
+ */
+ void setHost(const QString &host);
+
+ /**
+ * Set the destination server's port.
+ *
+ * @param port destination server's port
+ */
+ void setPort(int port);
+
+ /**
+ * Focus the dialog's username input field.
+ */
+ void setFocusToUser();
+
+ /**
+ * Configures the client acoording to the settings chosen in the quick connect
+ * dialog.
+ *
+ * @param client a disconnected client socket
+ */
+ void setupClient(KFTPEngine::Thread *client);
+private:
+ enum ServerProtocol {
+ SP_FTP = 0,
+ SP_SSL_EXPLICIT,
+ SP_SSL_IMPLICIT,
+ SP_SFTP
+ };
+
+ KFTPQuickConnectLayout *m_layout;
+
+ bool m_noUrlChange;
+ KURL m_url;
+ Bookmarks::BookmarkEditorTLS *m_protocolAdvancedDialog;
+
+ bool m_portChanged;
+
+ QMap<int, KURL> m_recentSites;
+private slots:
+ virtual void slotOk();
+
+ void slotUrlChanged(const QString &);
+ void slotHostChanged(const QString&);
+ void slotPortChanged(int);
+ void slotUserChanged();
+ void slotPassChanged();
+ void slotAnonClicked();
+ void slotProtocolChanged(int);
+ void slotProtoAdvancedClicked();
+ void slotRecentConnectionActivated(int index);
+ void slotClearRecentClicked();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/searchdialog.cpp b/kftpgrabber/src/widgets/searchdialog.cpp
new file mode 100644
index 0000000..ade32c3
--- /dev/null
+++ b/kftpgrabber/src/widgets/searchdialog.cpp
@@ -0,0 +1,165 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "widgets/searchdialog.h"
+#include "kftpsearchlayout.h"
+#include "kftpserverlineedit.h"
+#include "kftpbookmarks.h"
+#include "kftpqueue.h"
+
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qspinbox.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <klineedit.h>
+#include <kpassdlg.h>
+
+namespace KFTPWidgets {
+
+SearchDialog::SearchDialog(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n("Search & Replace"), Ok|Cancel, Ok)
+{
+ // Create the main widget
+ m_layout = new KFTPSearchLayout(this);
+
+ // Set the dialog options
+ setMainWidget(m_layout);
+ setInitialSize(QSize(500,400));
+
+ connect(m_layout->searchServer, SIGNAL(clicked()), this, SLOT(slotSearchServerClicked()));
+ connect(m_layout->searchServerName, SIGNAL(siteChanged(KFTPBookmarks::Site*)), this, SLOT(slotSiteChanged(KFTPBookmarks::Site*)));
+}
+
+QString SearchDialog::replaceCap(QStringList cap, const QString &text)
+{
+ QString tmp = text;
+
+ QStringList::Iterator end( cap.end() );
+ for(QStringList::Iterator i( cap.begin() ); i != end; ++i) {
+ tmp.replace("$" + QString::number(cap.findIndex(*i)), *i);
+ }
+
+ return tmp;
+}
+
+void SearchDialog::replace(KFTPQueue::Transfer *i)
+{
+ QRegExp s, d;
+
+ s.setPattern(m_layout->searchSrcPath->text());
+ d.setPattern(m_layout->searchDstPath->text());
+
+ KURL tmp = i->getSourceUrl().isLocalFile() ? i->getDestUrl() : i->getSourceUrl();
+ tmp.setPath("/");
+
+ KURL match;
+ match.setProtocol("ftp");
+ match.setHost(m_layout->searchServerHost->text());
+ match.setPort(m_layout->searchServerPort->value());
+ match.setUser(m_layout->searchServerUser->text());
+ match.setPass(m_layout->searchServerPass->password());
+ match.setPath("/");
+
+ if (s.search(i->getSourceUrl().path()) != -1 && d.search(i->getDestUrl().path()) != -1 &&
+ (!m_layout->searchServer->isChecked() || tmp.url() == match.url())) {
+ // Do the replacing
+ KURL newSource = i->getSourceUrl();
+ KURL newDest = i->getDestUrl();
+
+ newSource.setPath(replaceCap(s.capturedTexts(), m_layout->replaceSrcPath->text()));
+ newDest.setPath(replaceCap(d.capturedTexts(), m_layout->replaceDstPath->text()));
+
+ i->setSourceUrl(newSource);
+ i->setDestUrl(newDest);
+
+ i->emitUpdate();
+ }
+}
+
+void SearchDialog::searchAndReplace(KFTPQueue::QueueObject *parent)
+{
+ if (parent->isLocked())
+ return;
+
+ QPtrList<KFTPQueue::QueueObject> list = parent->getChildrenList();
+
+ KFTPQueue::QueueObject *i;
+ for (i = list.first(); i; i = list.next()) {
+ if (i->hasChildren() && !i->isLocked()) {
+ searchAndReplace(i);
+ }
+
+ if (i->isTransfer() && !i->isLocked())
+ replace(static_cast<KFTPQueue::Transfer*>(i));
+ }
+}
+
+void SearchDialog::searchAndReplace()
+{
+ searchAndReplace(KFTPQueue::Manager::self()->topLevelObject());
+}
+
+void SearchDialog::slotOk()
+{
+ searchAndReplace();
+ accept();
+}
+
+void SearchDialog::slotSearchServerClicked()
+{
+ m_layout->groupBox1->setEnabled(m_layout->searchServer->isChecked());
+}
+
+void SearchDialog::slotSiteChanged(KFTPBookmarks::Site *site)
+{
+ if (site) {
+ m_layout->searchServerHost->setText(site->getProperty("host"));
+ m_layout->searchServerPort->setValue(site->getIntProperty("port"));
+ m_layout->searchServerUser->setText(site->getProperty("username"));
+ m_layout->searchServerPass->erase();
+ m_layout->searchServerPass->insert(site->getProperty("password"));
+ } else {
+ m_layout->searchServerHost->clear();
+ m_layout->searchServerPort->setValue(21);
+ m_layout->searchServerUser->clear();
+ m_layout->searchServerPass->erase();
+ }
+}
+
+}
+
+#include "searchdialog.moc"
diff --git a/kftpgrabber/src/widgets/searchdialog.h b/kftpgrabber/src/widgets/searchdialog.h
new file mode 100644
index 0000000..7ae598b
--- /dev/null
+++ b/kftpgrabber/src/widgets/searchdialog.h
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2004 by the KFTPGrabber developers
+ * Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSSEARCHDIALOG_H
+#define KFTPWIDGETSSEARCHDIALOG_H
+
+#include <qdom.h>
+#include <kdialogbase.h>
+
+namespace KFTPQueue {
+ class Transfer;
+ class QueueObject;
+}
+
+namespace KFTPBookmarks {
+ class Site;
+}
+
+class KFTPSearchLayout;
+
+namespace KFTPWidgets {
+
+/**
+ * This dialog provides search & replace functionality for queued transfers.
+ *
+ * @author Jernej Kos
+ */
+class SearchDialog : public KDialogBase
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ */
+ SearchDialog(QWidget *parent = 0, const char *name = 0);
+private:
+ KFTPSearchLayout *m_layout;
+
+ void replace(KFTPQueue::Transfer *i);
+
+ QString replaceCap(QStringList cap, const QString &text);
+ void searchAndReplace(KFTPQueue::QueueObject *parent);
+ void searchAndReplace();
+private slots:
+ virtual void slotOk();
+
+ void slotSearchServerClicked();
+ void slotSiteChanged(KFTPBookmarks::Site *site);
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/sidebar.cpp b/kftpgrabber/src/widgets/sidebar.cpp
new file mode 100644
index 0000000..bd7545b
--- /dev/null
+++ b/kftpgrabber/src/widgets/sidebar.cpp
@@ -0,0 +1,393 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004-2005 Max Howell <max.howell@methylblue.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "misc.h"
+#include "sidebar.h"
+#include "multitabbar.h"
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qcursor.h>
+#include <qpainter.h>
+#include <qsignalmapper.h>
+#include <qstyle.h>
+
+namespace KFTPWidgets {
+
+class Splitter : public QWidget {
+public:
+ Splitter(Sidebar *w)
+ : QWidget(w, "divider"),
+ m_position(w->m_position)
+ {
+ if (m_position == Sidebar::Left)
+ setCursor(QCursor(SplitHCursor));
+ else
+ setCursor(QCursor(SplitVCursor));
+
+ styleChange(style());
+ }
+
+ virtual void paintEvent(QPaintEvent*)
+ {
+ QPainter p(this);
+ parentWidget()->style().drawPrimitive(QStyle::PE_Splitter, &p, rect(), colorGroup(), m_position == Sidebar::Left ? QStyle::Style_Horizontal : 0);
+ }
+
+ virtual void styleChange(QStyle&)
+ {
+ if (m_position == Sidebar::Left)
+ setFixedWidth(style().pixelMetric(QStyle::PM_SplitterWidth, this));
+ else
+ setFixedHeight(style().pixelMetric(QStyle::PM_SplitterWidth, this));
+ }
+
+ virtual void mouseMoveEvent(QMouseEvent *e)
+ {
+ static_cast<Sidebar*>(parent())->mouseMovedOverSplitter(e);
+ }
+private:
+ Sidebar::Position m_position;
+};
+
+Sidebar::Sidebar(QWidget *parent, Position position)
+ : QWidget(parent, "Sidebar"),
+ m_position(position),
+ m_divider(new KFTPWidgets::Splitter(this)),
+ m_content(new QVBox(this)),
+ m_tabBar(new MultiTabBar(position == Left ? MultiTabBar::Vertical : MultiTabBar::Horizontal, this)),
+ m_sidebarBox(new QWidget(this)),
+ m_currentIndex(-1),
+ m_lastIndex(-1),
+ m_mapper(new QSignalMapper(this))
+{
+ m_tabBar->setStyle(MultiTabBar::AMAROK);
+ m_tabBar->setPosition(m_position == Left ? MultiTabBar::Left : MultiTabBar::Bottom);
+ m_tabBar->showActiveTabTexts(true);
+
+ if (m_position == Left) {
+ m_pos = m_tabBar->sizeHint().width() + 5;
+
+ m_tabBar->setFixedWidth(m_pos);
+ m_tabBar->move(0, 3);
+
+ QVBoxLayout *layout = new QVBoxLayout(m_sidebarBox);
+ layout->addSpacing(3);
+ layout->setAutoAdd(true);
+
+ m_sidebarBox->move(m_pos, 0);
+ m_sidebarBox->hide();
+ m_divider->hide();
+ m_content->setSpacing(1);
+ } else {
+ m_pos = m_tabBar->sizeHint().height() + 5;
+ m_tabBar->setFixedHeight(m_pos);
+
+ QVBoxLayout *layout = new QVBoxLayout(m_sidebarBox);
+ layout->setAutoAdd(true);
+
+ m_sidebarBox->hide();
+ m_divider->hide();
+ m_content->setSpacing(1);
+ }
+
+ connect(m_mapper, SIGNAL(mapped(int)), SLOT(showHideSidebar(int)));
+}
+
+void Sidebar::setVisible(bool visible)
+{
+ if (m_position == Left) {
+ m_pos = m_tabBar->sizeHint().width() + 5;
+ m_tabBar->setFixedWidth(visible ? m_pos : 0);
+ } else {
+ m_pos = m_tabBar->sizeHint().height() + 5;
+ m_tabBar->setFixedHeight(visible ? m_pos : 0);
+ }
+
+ if (m_currentIndex != -1)
+ showHideSidebar(m_currentIndex);
+
+ if (visible)
+ m_tabBar->show();
+ else
+ m_tabBar->hide();
+
+ adjustWidgetSizes();
+}
+
+Sidebar::~Sidebar()
+{
+ KConfig *config;
+ // Save the currently selected sidebar
+ if (m_position == Left) {
+ config = KFTPGrabberBase::config(QString("Sidebar_%1").arg("Left"));
+ } else {
+ config = KFTPGrabberBase::config(QString("Sidebar_%1").arg("Bottom"));
+ }
+ if (m_currentIndex != -1) {
+ config->writeEntry("CurrentSidebar", currentSidebar()->name());
+ } else {
+ config->writeEntry("CurrentSidebar", QString::null);
+ }
+ if (m_position == Left) {
+ config->writeEntry("Size", m_sidebarBox->width());
+ } else {
+ config->writeEntry("Size", m_sidebarBox->height());
+ }
+}
+
+void Sidebar::polish()
+{
+ QWidget::polish();
+
+ KConfig *config = KFTPGrabberBase::config(QString("Sidebar_%1").arg(m_position == Left ? "Left" : "Bottom"));
+ const int index = indexForName(config->readEntry("CurrentSidebar"));
+
+ if (m_position == Left) {
+ uint M = 0;
+ for (SidebarList::ConstIterator it = m_sidebars.begin(), end = m_sidebars.end(); it != end; ++it) {
+ const uint m = (*it)->minimumWidth();
+ if (m > M) M = m;
+ }
+
+ const int width = config->readNumEntry("Size", sidebar(index)->sizeHint().width());
+
+ if (M > 250) {
+ M = 250;
+ }
+
+ m_sidebarBox->setMinimumWidth(M);
+ m_sidebarBox->resize(width, height());
+ } else {
+ uint M = 0;
+ for (SidebarList::ConstIterator it = m_sidebars.begin(), end = m_sidebars.end(); it != end; ++it) {
+ const uint m = (*it)->minimumHeight();
+ if (m > M) M = m;
+ }
+
+ const int height = config->readNumEntry("Size", sidebar(index)->height());
+
+ if (M > 250) {
+ M = 250;
+ }
+
+ m_sidebarBox->setMinimumHeight(M);
+ m_sidebarBox->resize(width(), height);
+ }
+
+ // If any sidebar should be open, open it
+ if (index != -1)
+ showHideSidebar(index);
+}
+
+void Sidebar::adjustWidgetSizes()
+{
+ if (m_position == Left) {
+ const uint w = width();
+ const uint h = height();
+ const uint mxW = maxSidebarWidth();
+ const uint p = (m_pos < mxW) ? m_pos : mxW;
+ const uint ppw = p + m_divider->width();
+ const uint tbw = m_tabBar->width();
+
+ m_divider->move(p, 0);
+
+ const uint offset = !m_divider->isHidden() ? ppw : tbw;
+
+ m_sidebarBox->resize(p - tbw, h);
+ m_content->setGeometry(offset, 0, w - offset, h);
+ } else {
+ const uint w = width();
+ const uint h = height();
+ const uint mxH = maxSidebarHeight();
+ const uint p = (m_pos < mxH) ? m_pos : mxH;
+ const uint pph = p + m_divider->height();
+ const uint tbh = m_tabBar->height();
+
+ m_divider->move(0, h - pph);
+
+ const uint offset = !m_divider->isHidden() ? pph : tbh;
+
+ m_sidebarBox->setGeometry(0, h - p, w, p - tbh);
+ m_content->setGeometry(0, 0, w, h - offset);
+ m_tabBar->move(0, h - tbh);
+ }
+}
+
+void Sidebar::mouseMovedOverSplitter(QMouseEvent *e)
+{
+ const uint oldPos = m_pos;
+ uint newPos;
+ uint minPos;
+ uint maxPos;
+
+ if (m_position == Left) {
+ newPos = mapFromGlobal(e->globalPos()).x();
+ minPos = m_tabBar->width() + m_sidebarBox->minimumWidth();
+ maxPos = maxSidebarWidth();
+ } else {
+ newPos = height() - mapFromGlobal(e->globalPos()).y();
+ minPos = m_tabBar->height() + m_sidebarBox->minimumHeight();
+ maxPos = maxSidebarHeight();
+ }
+
+ if (newPos < minPos)
+ m_pos = minPos;
+ else if (newPos > maxPos)
+ m_pos = maxPos;
+ else
+ m_pos = newPos;
+
+ if (m_pos != oldPos)
+ adjustWidgetSizes();
+}
+
+bool Sidebar::event(QEvent *e)
+{
+ switch (e->type()) {
+ case QEvent::LayoutHint: {
+ if (m_position == Left) {
+ setMinimumWidth(m_tabBar->minimumWidth() + m_divider->minimumWidth() + m_sidebarBox->width() + m_content->minimumWidth());
+ } else {
+ setMinimumHeight(m_tabBar->minimumHeight() + m_divider->minimumHeight() + m_sidebarBox->height() + m_content->minimumHeight());
+ }
+ break;
+ }
+ case QEvent::Resize: {
+ if (m_position == Left) {
+ m_divider->resize(0, height());
+ m_tabBar->resize(0, height());
+ } else {
+ m_divider->resize(width(), 0);
+ m_tabBar->resize(width(), 0);
+ }
+
+ adjustWidgetSizes();
+ return true;
+ }
+ default: break;
+ }
+
+ return QWidget::event(e);
+}
+
+void Sidebar::addSidebar(QWidget *widget, const QString &title, const QString &icon)
+{
+ const int id = m_tabBar->tabs()->count(); // the next available id
+ const QString name(widget->name());
+ QWidget *tab;
+
+ widget->reparent(m_sidebarBox, QPoint());
+ widget->hide();
+
+ m_tabBar->appendTab(SmallIcon(icon), id, title);
+ tab = m_tabBar->tab(id);
+ tab->setFocusPolicy(QWidget::NoFocus);
+
+ // We use a SignalMapper to show/hide the corresponding browser when tabs are clicked
+ connect(tab, SIGNAL(clicked()), m_mapper, SLOT(map()));
+ m_mapper->setMapping(tab, id);
+
+ m_sidebars.push_back(widget);
+}
+
+void Sidebar::showHideSidebar(int index)
+{
+ const int prevIndex = m_currentIndex;
+
+ if (m_currentIndex != -1) {
+ // First we need to hide the currentBrowser
+ m_currentIndex = -1;
+
+ m_sidebars[prevIndex]->hide();
+ m_tabBar->setTab(prevIndex, false);
+ }
+
+ if (index == prevIndex) {
+ // Close the sidebar
+ m_sidebarBox->hide();
+ m_divider->hide();
+
+ adjustWidgetSizes();
+ } else if ((uint) index < m_sidebars.count()) {
+ // Open up target
+ QWidget* const target = m_sidebars[index];
+ m_currentIndex = index;
+
+ m_divider->show();
+ target->show();
+ target->setFocus();
+ m_sidebarBox->show();
+ m_tabBar->setTab(index, true);
+
+ if (prevIndex == -1) {
+ if (m_position == Left) {
+ m_pos = m_sidebarBox->width() + m_tabBar->width();
+ } else {
+ m_pos = currentSidebar()->height() + m_tabBar->height();
+ }
+
+ adjustWidgetSizes();
+ }
+ }
+}
+
+QWidget *Sidebar::sidebar(const QString &name) const
+{
+ for (SidebarList::ConstIterator it = m_sidebars.begin(), end = m_sidebars.end(); it != end; ++it) {
+ if (name == (*it)->name())
+ return *it;
+ }
+
+ return 0;
+}
+
+int Sidebar::indexForName(const QString &name) const
+{
+ for (uint x = 0; x < m_sidebars.count(); ++x) {
+ if (name == m_sidebars[x]->name())
+ return x;
+ }
+
+ return -1;
+}
+
+}
+
+#include "sidebar.moc"
diff --git a/kftpgrabber/src/widgets/sidebar.h b/kftpgrabber/src/widgets/sidebar.h
new file mode 100644
index 0000000..4d4f710
--- /dev/null
+++ b/kftpgrabber/src/widgets/sidebar.h
@@ -0,0 +1,157 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ * Copyright (C) 2004-2005 Max Howell <max.howell@methylblue.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSSIDEBAR_H
+#define KFTPWIDGETSSIDEBAR_H
+
+#include <qwidget.h>
+#include <qvaluevector.h>
+
+class KURL;
+class QSignalMapper;
+class QVBox;
+
+namespace KFTPWidgets {
+
+typedef QValueVector<QWidget*> SidebarList;
+
+class MultiTabBar;
+class MultiTabBarTab;
+
+/**
+ * This class provides a sidebar. It uses a customised version of KMultiTabBar for
+ * displaying the actual tabs. It uses a QSignalMapper to map signals from the
+ * tabs to the actual sidebars.
+ *
+ * This class was copied from amaroK (BrowserBar) and modified to support bottom
+ * sidebars as well.
+ *
+ * @author amaroK developers
+ * @author Jernej Kos
+ */
+class Sidebar : public QWidget
+{
+Q_OBJECT
+friend class Splitter;
+public:
+ enum Position {
+ Left,
+ Bottom
+ };
+
+ Sidebar(QWidget *parent, Position position);
+ ~Sidebar();
+
+ /**
+ * Toggle visibility of this sidebar.
+ *
+ * @param visible True if the sidbar should be visible, false otherwise
+ */
+ void setVisible(bool visible);
+
+ /**
+ * Returns the content box of the sidebar. This should be where the widget, that
+ * should be resized when the sidebar resizes, should be placed.
+ *
+ * @return A QVBox container widget
+ */
+ QVBox *content() { return m_content; }
+
+ /**
+ * Returns the sidebar by it's name.
+ *
+ * @param name The sidebar's name
+ * @return A QWidget representing the sidebar or NULL if it is not found
+ */
+ QWidget *sidebar(const QString &name) const;
+
+ /**
+ * Returns the sidebar by it's index.
+ *
+ * @param index The sidebar's index
+ * @return A QWidget representing the sidebar or NULL if the index is invalid
+ */
+ QWidget *sidebar(int index) const { if (index < 0) index = 0; return m_sidebars[index]; }
+
+ /**
+ * Returns the currently open sidebar.
+ *
+ * @return A QWidget representing the current sidebar
+ */
+ QWidget *currentSidebar() const { return sidebar(m_currentIndex); }
+
+ /**
+ * Adds a new sidebar widget.
+ *
+ * @param widget The widget to add
+ * @param title The title that will be displayed on the tab
+ * @param icon Name of the icon that will be displayed besides the title
+ */
+ void addSidebar(QWidget *widget, const QString &title, const QString &icon);
+protected:
+ virtual void polish();
+ virtual bool event(QEvent *e);
+public slots:
+ void showSidebar(const QString &name) { showSidebar(indexForName(name)); }
+ void showSidebar(int index) { if (index != m_currentIndex) showHideSidebar(index); }
+ void showHideSidebar(int);
+ void closeCurrentSidebar() { showHideSidebar(m_currentIndex); }
+private:
+ int indexForName(const QString&) const;
+ void mouseMovedOverSplitter(QMouseEvent *e);
+
+ void adjustWidgetSizes();
+ uint maxSidebarWidth() const { return width() / 2; }
+ uint maxSidebarHeight() const { return height() / 2; }
+
+ Position m_position;
+ uint m_pos;
+
+ QWidget *m_divider;
+ QVBox *m_content;
+ MultiTabBar *m_tabBar;
+ QWidget *m_sidebarBox;
+
+ SidebarList m_sidebars;
+ int m_currentIndex;
+ int m_lastIndex;
+
+ QSignalMapper *m_mapper;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/systemtray.cpp b/kftpgrabber/src/widgets/systemtray.cpp
new file mode 100644
index 0000000..98179b7
--- /dev/null
+++ b/kftpgrabber/src/widgets/systemtray.cpp
@@ -0,0 +1,123 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <kpopupmenu.h>
+#include <klocale.h>
+#include <kwin.h>
+
+#include "widgets/systemtray.h"
+#include "widgets/balloon.h"
+#include "mainwindow.h"
+#include "mainactions.h"
+#include "kftpbookmarks.h"
+#include "kftpqueue.h"
+#include "misc.h"
+#include "misc/config.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+SystemTray *SystemTray::m_self = 0L;
+
+SystemTray::SystemTray(MainWindow *parent)
+ : KSystemTray(parent),
+ m_balloon(0),
+ m_actions(parent->getActions())
+{
+ m_self = this;
+
+ // Set icon and show it
+ setPixmap(loadToolbarPixmap("kftpgrabber"));
+
+ if (KFTPCore::Config::showSystrayIcon())
+ show();
+
+ // Add some actions
+ m_bookmarkMenu = new KActionMenu(i18n("Bookmarks"));
+ slotUpdateBookmarks();
+
+ // Let our bookmarks be up to date
+ connect(KFTPBookmarks::Manager::self(), SIGNAL(update()), this, SLOT(slotUpdateBookmarks()));
+
+ m_actions->m_fileConnectAction->plug(contextMenu(), 1);
+ m_bookmarkMenu->plug(contextMenu(), 1);
+
+ // Ensure that we actually quit
+ connect(this, SIGNAL(quitSelected()), this, SLOT(slotQuitSelected()));
+}
+
+SystemTray::~SystemTray()
+{
+ delete m_bookmarkMenu;
+}
+
+void SystemTray::slotQuitSelected()
+{
+ m_actions->m_closeApp = true;
+}
+
+void SystemTray::slotUpdateBookmarks()
+{
+ // Re-create the bookmarks menu
+ m_bookmarkMenu->popupMenu()->clear();
+ KFTPBookmarks::Manager::self()->guiPopulateBookmarksMenu(m_bookmarkMenu, QDomNode(), false);
+}
+
+void SystemTray::showBalloon(const QString &text)
+{
+ // Create a little modified Kopete balloon
+ if (m_balloon) {
+ m_balloon->hide();
+ delete m_balloon;
+ }
+
+ m_balloon = new Balloon("<qt><nobr><b>KFTPGrabber</b><br>" + text + "</nobr></qt>", "info");
+ m_balloon->setAnchor(mapToGlobal(pos()));
+ m_balloon->show();
+ KWin::setOnAllDesktops(m_balloon->winId() , true);
+
+ // Hide the balloon after 5 sec
+ QTimer::singleShot(5000, this, SLOT(slotHideBalloon()));
+}
+
+void SystemTray::slotHideBalloon()
+{
+ m_balloon->hide();
+}
+
+}
+
+#include "systemtray.moc"
diff --git a/kftpgrabber/src/widgets/systemtray.h b/kftpgrabber/src/widgets/systemtray.h
new file mode 100644
index 0000000..ce77811
--- /dev/null
+++ b/kftpgrabber/src/widgets/systemtray.h
@@ -0,0 +1,93 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSSYSTEMTRAY_H
+#define KFTPWIDGETSSYSTEMTRAY_H
+
+#include <ksystemtray.h>
+#include <kaction.h>
+
+#include <qmenudata.h>
+
+class MainWindow;
+class MainActions;
+
+namespace KFTPWidgets {
+
+class Balloon;
+
+/**
+ * A system tray icon that is used for some actions.
+ *
+ * @author Jernej Kos
+ */
+class SystemTray : public KSystemTray
+{
+Q_OBJECT
+public:
+ /**
+ * Get the global system tray instance.
+ */
+ static SystemTray *self() { return SystemTray::m_self; }
+
+ /**
+ * Class constructor.
+ */
+ SystemTray(MainWindow *parent);
+
+ /**
+ * Class destructor.
+ */
+ ~SystemTray();
+
+ /**
+ * Show a balloon notification widget.
+ */
+ void showBalloon(const QString &text);
+protected:
+ static SystemTray *m_self;
+private:
+ KActionMenu *m_bookmarkMenu;
+ Balloon *m_balloon;
+ MainActions *m_actions;
+private slots:
+ void slotHideBalloon();
+ void slotUpdateBookmarks();
+ void slotQuitSelected();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/trafficgraph.cpp b/kftpgrabber/src/widgets/trafficgraph.cpp
new file mode 100644
index 0000000..ddd339f
--- /dev/null
+++ b/kftpgrabber/src/widgets/trafficgraph.cpp
@@ -0,0 +1,628 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2004 by the KFTPGrabber developers
+ * Copyright (C) 2003-2004 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include <math.h>
+#include <string.h>
+
+#include <qpainter.h>
+#include <qpixmap.h>
+
+#include <klocale.h>
+
+#include "trafficgraph.h"
+
+namespace KFTPWidgets {
+
+static inline int min(int a, int b)
+{
+ return (a < b ? a : b);
+}
+
+TrafficGraph::TrafficGraph(QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ // Auto deletion does not work for pointer to arrays.
+ m_beamData.setAutoDelete(false);
+
+ setBackgroundMode(NoBackground);
+
+ m_samples = 0;
+ m_minValue = m_maxValue = 0.0;
+ m_useAutoRange = true;
+
+ m_graphStyle = GRAPH_POLYGON;
+
+ // Anything smaller than this does not make sense.
+ setMinimumSize(16, 100);
+ setSizePolicy(QSizePolicy(QSizePolicy::Expanding,
+ QSizePolicy::Expanding, false));
+
+ m_showVerticalLines = true;
+ m_verticalLinesColor = QColor(0x04FB1D);
+ m_verticalLinesDistance = 30;
+ m_verticalLinesScroll = true;
+ m_verticalLinesOffset = 0;
+ m_horizontalScale = 1;
+
+ m_showHorizontalLines = true;
+ m_horizontalLinesColor = QColor(0x04FB1D);
+ m_horizontalLinesCount = 5;
+
+ m_showLabels = true;
+ m_showTopBar = false;
+ m_fontSize = 8;
+
+ m_backgroundColor = QColor(0x313031);
+}
+
+
+TrafficGraph::~TrafficGraph()
+{
+ for (double* p = m_beamData.first(); p; p = m_beamData.next())
+ delete [] p;
+}
+
+bool TrafficGraph::addBeam(const QColor &color)
+{
+ double* d = new double[m_samples];
+ memset(d, 0, sizeof(double) * m_samples);
+ m_beamData.append(d);
+ m_beamColor.append(color);
+
+ return true;
+}
+
+void TrafficGraph::addSample(const QValueList<double>& sampleBuf)
+{
+ if (m_beamData.count() != sampleBuf.count())
+ return;
+
+ double* d;
+ if (m_useAutoRange) {
+ double sum = 0;
+ for (d = m_beamData.first(); d; d = m_beamData.next()) {
+ sum += d[0];
+ if (sum < m_minValue)
+ m_minValue = sum;
+ if (sum > m_maxValue)
+ m_maxValue = sum;
+ }
+ }
+
+ /* If the vertical lines are scrolling, increment the offset
+ * so they move with the data. The vOffset / hScale confusion
+ * is because v refers to Vertical Lines, and h to the horizontal
+ * distance between the vertical lines. */
+ if (m_verticalLinesScroll) {
+ m_verticalLinesOffset = (m_verticalLinesOffset + m_horizontalScale)
+ % m_verticalLinesDistance;
+ }
+
+ // Shift data buffers one sample down and insert new samples.
+ QValueList<double>::ConstIterator s;
+ for (d = m_beamData.first(), s = sampleBuf.begin(); d; d = m_beamData.next(), ++s) {
+ memmove(d, d + 1, (m_samples - 1) * sizeof(double));
+ d[m_samples - 1] = *s;
+ }
+
+ update();
+}
+
+void TrafficGraph::changeRange(int beam, double min, double max)
+{
+ // Only the first beam affects range calculation.
+ if (beam > 1)
+ return;
+
+ m_minValue = min;
+ m_maxValue = max;
+}
+
+QValueList<QColor> &TrafficGraph::beamColors()
+{
+ return m_beamColor;
+}
+
+void TrafficGraph::removeBeam(uint pos)
+{
+ m_beamColor.remove(m_beamColor.at(pos));
+ m_beamData.remove(pos);
+}
+
+void TrafficGraph::setUseAutoRange(bool value)
+{
+ m_useAutoRange = value;
+}
+
+bool TrafficGraph::useAutoRange() const
+{
+ return m_useAutoRange;
+}
+
+void TrafficGraph::setMinValue(double min)
+{
+ m_minValue = min;
+}
+
+double TrafficGraph::minValue() const
+{
+ return (m_useAutoRange ? 0 : m_minValue);
+}
+
+void TrafficGraph::setMaxValue(double max)
+{
+ m_maxValue = max;
+}
+
+double TrafficGraph::maxValue() const
+{
+ return (m_useAutoRange ? 0 : m_maxValue);
+}
+
+void TrafficGraph::setGraphStyle(uint style)
+{
+ m_graphStyle = style;
+}
+
+uint TrafficGraph::graphStyle() const
+{
+ return m_graphStyle;
+}
+
+void TrafficGraph::setHorizontalScale(uint scale)
+{
+ if (scale == m_horizontalScale)
+ return;
+
+ m_horizontalScale = scale;
+ if (isVisible())
+ updateDataBuffers();
+}
+
+uint TrafficGraph::horizontalScale() const
+{
+ return m_horizontalScale;
+}
+
+void TrafficGraph::setShowVerticalLines(bool value)
+{
+ m_showVerticalLines = value;
+}
+
+bool TrafficGraph::showVerticalLines() const
+{
+ return m_showVerticalLines;
+}
+
+void TrafficGraph::setVerticalLinesColor(const QColor &color)
+{
+ m_verticalLinesColor = color;
+}
+
+QColor TrafficGraph::verticalLinesColor() const
+{
+ return m_verticalLinesColor;
+}
+
+void TrafficGraph::setVerticalLinesDistance(int distance)
+{
+ m_verticalLinesDistance = distance;
+}
+
+int TrafficGraph::verticalLinesDistance() const
+{
+ return m_verticalLinesDistance;
+}
+
+void TrafficGraph::setVerticalLinesScroll(bool value)
+{
+ m_verticalLinesScroll = value;
+}
+
+bool TrafficGraph::verticalLinesScroll() const
+{
+ return m_verticalLinesScroll;
+}
+
+void TrafficGraph::setShowHorizontalLines(bool value)
+{
+ m_showHorizontalLines = value;
+}
+
+bool TrafficGraph::showHorizontalLines() const
+{
+ return m_showHorizontalLines;
+}
+
+void TrafficGraph::setHorizontalLinesColor(const QColor &color)
+{
+ m_horizontalLinesColor = color;
+}
+
+QColor TrafficGraph::horizontalLinesColor() const
+{
+ return m_horizontalLinesColor;
+}
+
+void TrafficGraph::setHorizontalLinesCount(int count)
+{
+ m_horizontalLinesCount = count;
+}
+
+int TrafficGraph::horizontalLinesCount() const
+{
+ return m_horizontalLinesCount;
+}
+
+void TrafficGraph::setShowLabels(bool value)
+{
+ m_showLabels = value;
+}
+
+bool TrafficGraph::showLabels() const
+{
+ return m_showLabels;
+}
+
+void TrafficGraph::setShowTopBar(bool value)
+{
+ m_showTopBar = value;
+}
+
+bool TrafficGraph::showTopBar() const
+{
+ return m_showTopBar;
+}
+
+void TrafficGraph::setFontSize(int size)
+{
+ m_fontSize = size;
+}
+
+int TrafficGraph::fontSize() const
+{
+ return m_fontSize;
+}
+
+void TrafficGraph::setBackgroundColor(const QColor &color)
+{
+ m_backgroundColor = color;
+}
+
+QColor TrafficGraph::backgroundColor() const
+{
+ return m_backgroundColor;
+}
+
+void TrafficGraph::resizeEvent(QResizeEvent*)
+{
+ updateDataBuffers();
+}
+
+void TrafficGraph::updateDataBuffers()
+{
+ /* Since the data buffers for the beams are equal in size to the
+ * width of the widget minus 2 we have to enlarge or shrink the
+ * buffers accordingly when a resize occures. To have a nicer
+ * display we try to keep as much data as possible. Data that is
+ * lost due to shrinking the buffers cannot be recovered on
+ * enlarging though. */
+
+ /* Determine new number of samples first.
+ * +0.5 to ensure rounding up
+ * +2 for extra data points so there is
+ * 1) no wasted space and
+ * 2) no loss of precision when drawing the first data point. */
+ uint newSampleNum = static_cast<uint>(((width() - 2 ) / m_horizontalScale) + 2.5);
+
+ // overlap between the old and the new buffers.
+ int overlap = min(m_samples, newSampleNum);
+
+ for (uint i = 0; i < m_beamData.count(); ++i) {
+ double* nd = new double[newSampleNum];
+
+ // initialize new part of the new buffer
+ if (newSampleNum > (uint) overlap)
+ memset(nd, 0, sizeof(double) * (newSampleNum - overlap));
+
+ // copy overlap from old buffer to new buffer
+ memcpy(nd + (newSampleNum - overlap), m_beamData.at(i) + (m_samples - overlap), overlap * sizeof(double));
+
+ m_beamData.remove(i);
+ m_beamData.insert(i, nd);
+ }
+
+ m_samples = newSampleNum;
+}
+
+void TrafficGraph::paintEvent(QPaintEvent*)
+{
+ uint w = width();
+ uint h = height();
+
+ /* Do not do repaints when the widget is not yet setup properly. */
+ if (w <= 2)
+ return;
+
+ QPixmap pm(w, h);
+ QPainter p;
+ p.begin(&pm, this);
+
+ pm.fill(m_backgroundColor);
+ /* Draw white line along the bottom and the right side of the
+ * widget to create a 3D like look. */
+ p.setPen(QColor(colorGroup().light()));
+ p.drawLine(0, h - 1, w - 1, h - 1);
+ p.drawLine(w - 1, 0, w - 1, h - 1);
+
+ p.setClipRect(1, 1, w - 2, h - 2);
+ double range = m_maxValue - m_minValue;
+
+ /* If the range is too small we will force it to 1.0 since it
+ * looks a lot nicer. */
+ if (range < 0.000001)
+ range = 1.0;
+
+ double minValue = m_minValue;
+ if (m_useAutoRange) {
+ if (m_minValue != 0.0) {
+ double dim = pow(10, floor(log10(fabs(m_minValue )))) / 2;
+ if (m_minValue < 0.0)
+ minValue = dim * floor(m_minValue / dim);
+ else
+ minValue = dim * ceil(m_minValue / dim);
+ range = m_maxValue - minValue;
+ if (range < 0.000001)
+ range = 1.0;
+ }
+
+ // Massage the range so that the grid shows some nice values.
+ double step = range / m_horizontalLinesCount;
+ double dim = pow(10, floor(log10(step))) / 2;
+ range = dim * ceil(step / dim) * m_horizontalLinesCount;
+ }
+
+ double maxValue = minValue + range;
+
+ int top = 0;
+ if (m_showTopBar && h > (m_fontSize + 2 + m_horizontalLinesCount * 10)) {
+ /* Draw horizontal bar with current sensor values at top of display. */
+ p.setPen(m_horizontalLinesColor);
+ int x0 = w / 2;
+ p.setFont(QFont(p.font().family(), m_fontSize));
+ top = p.fontMetrics().height();
+ h -= top;
+ int h0 = top - 2;
+ p.drawText(0, 0, x0, top - 2, Qt::AlignCenter, i18n("Bandwidth usage"));
+
+ p.drawLine(x0 - 1, 1, x0 - 1, h0);
+ p.drawLine(0, top - 1, w - 2, top - 1);
+
+ double bias = -minValue;
+ double scaleFac = ( w - x0 - 2 ) / range;
+ QValueList<QColor>::Iterator col;
+ col = m_beamColor.begin();
+
+ for (double *d = m_beamData.first(); d; d = m_beamData.next(), ++col) {
+ int start = x0 + (int) (bias * scaleFac);
+ int end = x0 + (int) ((bias += d[ w - 3 ]) * scaleFac);
+
+ /* If the rect is wider than 2 pixels we draw only the last
+ * pixels with the bright color. The rest is painted with
+ * a 50% darker color. */
+ if (end - start > 1) {
+ p.setPen((*col).dark(150));
+ p.setBrush((*col).dark(150));
+ p.drawRect(start, 1, end - start, h0);
+ p.setPen(*col);
+ p.drawLine(end, 1, end, h0);
+ } else if (start - end > 1) {
+ p.setPen((*col).dark(150));
+ p.setBrush((*col).dark(150));
+ p.drawRect(end, 1, start - end, h0);
+ p.setPen(*col);
+ p.drawLine(end, 1, end, h0);
+ } else {
+ p.setPen(*col);
+ p.drawLine(start, 1, start, h0);
+ }
+ }
+ }
+
+ /* Draw scope-like grid vertical lines */
+ if (m_showVerticalLines && w > 60) {
+ p.setPen(m_verticalLinesColor);
+ for (uint x = m_verticalLinesOffset; x < (w - 2); x += m_verticalLinesDistance)
+ p.drawLine(w - x, top, w - x, h + top - 2);
+ }
+
+ /* In autoRange mode we determine the range and plot the values in
+ * one go. This is more efficiently than running through the
+ * buffers twice but we do react on recently discarded samples as
+ * well as new samples one plot too late. So the range is not
+ * correct if the recently discarded samples are larger or smaller
+ * than the current extreme values. But we can probably live with
+ * this. */
+ if (m_useAutoRange)
+ m_minValue = m_maxValue = 0.0;
+
+ /* Plot stacked values */
+ double scaleFac = (h - 2) / range;
+ if (m_graphStyle == GRAPH_ORIGINAL) {
+ int xPos = 0;
+
+ for (int i = 0; i < m_samples; i++, xPos += m_horizontalScale) {
+ double bias = -minValue;
+ QValueList<QColor>::Iterator col;
+ col = m_beamColor.begin();
+ double sum = 0.0;
+
+ for (double *d = m_beamData.first(); d; d = m_beamData.next(), ++col) {
+ if (m_useAutoRange) {
+ sum += d[i];
+ if (sum < m_minValue)
+ m_minValue = sum;
+ if (sum > m_maxValue)
+ m_maxValue = sum;
+ }
+
+ int start = top + h - 2 - (int) (bias * scaleFac);
+ int end = top + h - 2 - (int) ((bias + d[ i ] ) * scaleFac);
+ bias += d[i];
+
+ /* If the line is longer than 2 pixels we draw only the last
+ * 2 pixels with the bright color. The rest is painted with
+ * a 50% darker color. */
+ if (end - start > 2) {
+ p.fillRect(xPos, start, m_horizontalScale, end - start - 1, (*col).dark(150));
+ p.fillRect(xPos, end - 1, m_horizontalScale, 2, *col);
+ } else if (start - end > 2) {
+ p.fillRect(xPos, start, m_horizontalScale, end - start + 1, (*col).dark(150));
+ p.fillRect(xPos, end + 1, m_horizontalScale, 2, *col);
+ } else
+ p.fillRect(xPos, start, m_horizontalScale, end - start, *col);
+
+ }
+ }
+ } else if (m_graphStyle == GRAPH_POLYGON) {
+ int *prevVals = new int[m_beamData.count()];
+ int hack[4];
+ int x1 = w - ((m_samples + 1) * m_horizontalScale);
+
+ for (int i = 0; i < m_samples; i++) {
+ QValueList<QColor>::Iterator col;
+ col = m_beamColor.begin();
+ double sum = 0.0;
+ int y = top + h - 2;
+ int oldY = top + h;
+ int oldPrevY = oldY;
+ int height = 0;
+ int j = 0;
+ int jMax = m_beamData.count() - 1;
+ x1 += m_horizontalScale;
+ int x2 = x1 + m_horizontalScale;
+
+ for (double *d = m_beamData.first(); d; d = m_beamData.next(), ++col, j++) {
+ if (m_useAutoRange) {
+ sum += d[i];
+
+ if ( sum < m_minValue )
+ m_minValue = sum;
+ if ( sum > m_maxValue )
+ m_maxValue = sum;
+ }
+
+ height = (int) ((d[i] - minValue) * scaleFac);
+ y -= height;
+
+ /* If the line is longer than 2 pixels we draw only the last
+ * 2 pixels with the bright color. The rest is painted with
+ * a 50% darker color. */
+ QPen lastPen = QPen(p.pen());
+ p.setPen((*col).dark(150));
+ p.setBrush((*col).dark(150));
+ QPointArray pa(4);
+ int prevY = (i == 0) ? y : prevVals[j];
+ pa.putPoints(0, 1, x1, prevY);
+ pa.putPoints(1, 1, x2, y);
+ pa.putPoints(2, 1, x2, oldY);
+ pa.putPoints(3, 1, x1, oldPrevY);
+ p.drawPolygon(pa);
+ p.setPen(lastPen);
+ if (jMax == 0) {
+ // draw as normal, no deferred drawing req'd.
+ p.setPen(*col);
+ p.drawLine(x1, prevY, x2, y);
+ } else if (j == jMax) {
+ // draw previous values and current values
+ p.drawLine(hack[0], hack[1], hack[2], hack[3]);
+ p.setPen(*col);
+ p.drawLine(x1, prevY, x2, y);
+ } else if (j == 0) {
+ // save values only
+ hack[0] = x1;
+ hack[1] = prevY;
+ hack[2] = x2;
+ hack[3] = y;
+ p.setPen(*col);
+ } else {
+ p.drawLine(hack[0], hack[1], hack[2], hack[3]);
+ hack[0] = x1;
+ hack[1] = prevY;
+ hack[2] = x2;
+ hack[3] = y;
+ p.setPen(*col);
+ }
+
+ prevVals[j] = y;
+ oldY = y;
+ oldPrevY = prevY;
+ }
+ }
+
+ delete[] prevVals;
+ }
+
+ /* Draw horizontal lines and values. Lines are drawn when the
+ * height is greater than 10 times hCount + 1, values are shown
+ * when width is greater than 60 */
+ if (m_showHorizontalLines && h > (10 * (m_horizontalLinesCount + 1))) {
+ p.setPen(m_horizontalLinesColor);
+ p.setFont(QFont(p.font().family(), m_fontSize));
+ QString val;
+
+ for (uint y = 1; y < m_horizontalLinesCount; y++) {
+ p.drawLine(0, top + y * (h / m_horizontalLinesCount), w - 2, top + y * (h / m_horizontalLinesCount));
+
+ if (m_showLabels && h > (m_fontSize + 1) * (m_horizontalLinesCount + 1) && w > 60 ) {
+ val = QString("%1").arg(maxValue - y * (range / m_horizontalLinesCount));
+ p.drawText(6, top + y * (h / m_horizontalLinesCount) - 1, val);
+ }
+ }
+
+ if (m_showLabels && h > (m_fontSize + 1) * (m_horizontalLinesCount + 1) && w > 60) {
+ val = QString("%1").arg(minValue);
+ p.drawText(6, top + h - 2, val);
+ }
+ }
+
+ p.end();
+ bitBlt(this, 0, 0, &pm);
+}
+
+}
+
+#include "trafficgraph.moc"
diff --git a/kftpgrabber/src/widgets/trafficgraph.h b/kftpgrabber/src/widgets/trafficgraph.h
new file mode 100644
index 0000000..3822165
--- /dev/null
+++ b/kftpgrabber/src/widgets/trafficgraph.h
@@ -0,0 +1,155 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPTRAFFICGRAPH_H
+#define KFTPTRAFFICGRAPH_H
+
+#include <qpoint.h>
+#include <qdialog.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qvaluelist.h>
+
+#define GRAPH_POLYGON 0
+#define GRAPH_ORIGINAL 1
+
+class QColor;
+
+namespace KFTPWidgets {
+
+/**
+@author Jernej Kos
+*/
+class TrafficGraph : public QWidget
+{
+Q_OBJECT
+public:
+ TrafficGraph(QWidget *parent = 0, const char *name = 0);
+ ~TrafficGraph();
+
+ bool addBeam(const QColor &color);
+ void addSample(const QValueList<double> &samples);
+
+ void removeBeam(uint pos);
+
+ void changeRange(int beam, double min, double max);
+
+ QValueList<QColor> &beamColors();
+
+ void setUseAutoRange(bool value);
+ bool useAutoRange() const;
+
+ void setMinValue(double min);
+ double minValue() const;
+
+ void setMaxValue(double max);
+ double maxValue() const;
+
+ void setGraphStyle(uint style);
+ uint graphStyle() const;
+
+ void setHorizontalScale(uint scale);
+ uint horizontalScale() const;
+
+ void setShowVerticalLines(bool value);
+ bool showVerticalLines() const;
+
+ void setVerticalLinesColor(const QColor &color);
+ QColor verticalLinesColor() const;
+
+ void setVerticalLinesDistance(int distance);
+ int verticalLinesDistance() const;
+
+ void setVerticalLinesScroll(bool value);
+ bool verticalLinesScroll() const;
+
+ void setShowHorizontalLines(bool value);
+ bool showHorizontalLines() const;
+
+ void setHorizontalLinesColor(const QColor &color);
+ QColor horizontalLinesColor() const;
+
+ void setHorizontalLinesCount(int count);
+ int horizontalLinesCount() const;
+
+ void setShowLabels(bool value);
+ bool showLabels() const;
+
+ void setShowTopBar(bool value);
+ bool showTopBar() const;
+
+ void setFontSize(int size);
+ int fontSize() const;
+
+ void setBackgroundColor(const QColor &color);
+ QColor backgroundColor() const;
+protected:
+ void updateDataBuffers();
+
+ virtual void resizeEvent(QResizeEvent*);
+ virtual void paintEvent(QPaintEvent*);
+private:
+ double m_minValue;
+ double m_maxValue;
+ bool m_useAutoRange;
+
+ uint m_graphStyle;
+
+ bool m_showVerticalLines;
+ QColor m_verticalLinesColor;
+ uint m_verticalLinesDistance;
+ bool m_verticalLinesScroll;
+ uint m_verticalLinesOffset;
+ uint m_horizontalScale;
+
+ bool m_showHorizontalLines;
+ QColor m_horizontalLinesColor;
+ uint m_horizontalLinesCount;
+
+ bool m_showLabels;
+ bool m_showTopBar;
+ uint m_fontSize;
+
+ QColor m_backgroundColor;
+
+ QPtrList<double> m_beamData;
+ QValueList<QColor> m_beamColor;
+
+ int m_samples;
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/verifier.cpp b/kftpgrabber/src/widgets/verifier.cpp
new file mode 100644
index 0000000..1f6c9d9
--- /dev/null
+++ b/kftpgrabber/src/widgets/verifier.cpp
@@ -0,0 +1,148 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#include "verifier.h"
+#include "misc.h"
+#include "listviewitem.h"
+
+#include <klocale.h>
+#include <klistview.h>
+#include <kmessagebox.h>
+#include <kprogress.h>
+#include <kurl.h>
+
+#include <qheader.h>
+#include <qlabel.h>
+
+// UI layouts
+#include "ui/checksum_verifier.h"
+
+using namespace KFTPGrabberBase;
+
+namespace KFTPWidgets {
+
+Verifier::Verifier(QWidget *parent, const char *name)
+ : KDialogBase(parent, name, true, i18n("Checksum verifier"), Cancel, Cancel, true),
+ m_verifier(0)
+{
+ m_layout = new VerifierLayout(this);
+ setMainWidget(m_layout);
+
+ // Create columns
+ m_layout->fileList->addColumn(i18n("Filename"));
+ m_layout->fileList->addColumn(i18n("Checksum"), 100);
+
+ m_layout->fileList->setAllColumnsShowFocus(true);
+ m_layout->fileList->header()->setStretchEnabled(true, 0);
+}
+
+Verifier::~Verifier()
+{
+ if (m_verifier)
+ delete m_verifier;
+}
+
+void Verifier::setFile(const QString &filename)
+{
+ // Create the verifier
+ m_verifier = new KFTPCore::ChecksumVerifier(filename);
+ m_layout->currentFile->setText(KURL(filename).fileName());
+
+ connect(m_verifier, SIGNAL(fileList(QValueList<QPair<QString, QString> >)), this, SLOT(slotHaveFileList(QValueList<QPair<QString, QString> >)));
+ connect(m_verifier, SIGNAL(fileDone(const QString&, KFTPCore::ChecksumVerifier::Result)), this, SLOT(slotFileDone(const QString&, KFTPCore::ChecksumVerifier::Result)));
+ connect(m_verifier, SIGNAL(progress(int)), this, SLOT(slotProgress(int)));
+ connect(m_verifier, SIGNAL(error()), this, SLOT(slotError()));
+
+ // Start the verification
+ m_verifier->verify();
+}
+
+void Verifier::slotHaveFileList(QValueList<QPair<QString, QString> > list)
+{
+ for (QValueList<QPair<QString, QString> >::iterator i = list.begin(); i != list.end(); ++i) {
+ KFTPWidgets::ListViewItem *item = new KFTPWidgets::ListViewItem(m_layout->fileList);
+ item->setText(0, (*i).first);
+ item->setText(1, (*i).second);
+ }
+}
+
+void Verifier::slotFileDone(const QString &filename, KFTPCore::ChecksumVerifier::Result result)
+{
+ KFTPWidgets::ListViewItem *item = static_cast<KFTPWidgets::ListViewItem*>(m_layout->fileList->findItem(filename, 0));
+
+ if (item) {
+ switch (result) {
+ case KFTPCore::ChecksumVerifier::Ok: {
+ item->setPixmap(0, loadSmallPixmap("ok"));
+ item->setTextColor(0, QColor(0, 200, 0));
+ item->setTextColor(1, QColor(0, 200, 0));
+ break;
+ }
+ case KFTPCore::ChecksumVerifier::NotFound: {
+ item->setPixmap(0, loadSmallPixmap("error"));
+ item->setTextColor(0, QColor(128, 128, 128));
+ item->setTextColor(1, QColor(128, 128, 128));
+ break;
+ }
+ case KFTPCore::ChecksumVerifier::Error: {
+ item->setPixmap(0, loadSmallPixmap("error"));
+ item->setTextColor(0, QColor(255, 0, 0));
+ item->setTextColor(1, QColor(255, 0, 0));
+ break;
+ }
+ }
+
+ m_layout->fileList->ensureItemVisible(item);
+ }
+}
+
+void Verifier::slotProgress(int percent)
+{
+ m_layout->checkProgress->setProgress(percent);
+
+ if (percent == 100) {
+ KMessageBox::information(0, i18n("Verification complete!"));
+ }
+}
+
+void Verifier::slotError()
+{
+ KMessageBox::error(0, i18n("Unable to open checksum file or file has an incorrect format!"));
+ close();
+}
+
+}
+#include "verifier.moc"
diff --git a/kftpgrabber/src/widgets/verifier.h b/kftpgrabber/src/widgets/verifier.h
new file mode 100644
index 0000000..6f1ee1e
--- /dev/null
+++ b/kftpgrabber/src/widgets/verifier.h
@@ -0,0 +1,74 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2005 by the KFTPGrabber developers
+ * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+
+#ifndef KFTPWIDGETSVERIFIER_H
+#define KFTPWIDGETSVERIFIER_H
+
+#include "checksumverifier.h"
+
+#include <kdialogbase.h>
+
+#include <qvaluelist.h>
+#include <qpair.h>
+
+class VerifierLayout;
+
+namespace KFTPWidgets {
+
+/**
+ * @author Jernej Kos
+ */
+class Verifier : public KDialogBase
+{
+Q_OBJECT
+public:
+ Verifier(QWidget *parent = 0, const char *name = 0);
+ ~Verifier();
+
+ void setFile(const QString &filename);
+private:
+ VerifierLayout *m_layout;
+ KFTPCore::ChecksumVerifier *m_verifier;
+private slots:
+ void slotHaveFileList(QValueList<QPair<QString, QString> > list);
+ void slotFileDone(const QString &filename, KFTPCore::ChecksumVerifier::Result result);
+ void slotProgress(int percent);
+ void slotError();
+};
+
+}
+
+#endif
diff --git a/kftpgrabber/src/widgets/widgetlister.cpp b/kftpgrabber/src/widgets/widgetlister.cpp
new file mode 100644
index 0000000..55022d2
--- /dev/null
+++ b/kftpgrabber/src/widgets/widgetlister.cpp
@@ -0,0 +1,172 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#include "widgetlister.h"
+
+#include <klocale.h>
+#include <kguiitem.h>
+#include <kpushbutton.h>
+#include <kdialog.h>
+
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qhbox.h>
+
+namespace KFTPWidgets {
+
+WidgetLister::WidgetLister(QWidget *parent, int minWidgets, int maxWidgets)
+ : QWidget(parent)
+{
+ m_widgetList.setAutoDelete(true);
+
+ m_minWidgets = QMAX(minWidgets, 0);
+ m_maxWidgets = QMAX(maxWidgets, m_minWidgets + 1);
+
+ // The button box
+ m_layout = new QVBoxLayout(this, 0, 4);
+ m_buttonBox = new QHBox(this);
+ m_buttonBox->setSpacing(KDialog::spacingHint());
+ m_layout->addWidget(m_buttonBox);
+
+ m_buttonMore = new KPushButton(KGuiItem(i18n("more widgets", "More"), "button_more"), m_buttonBox);
+ m_buttonBox->setStretchFactor(m_buttonMore, 0);
+
+ m_buttonFewer = new KPushButton(KGuiItem(i18n("fewer widgets", "Fewer"), "button_fewer"), m_buttonBox);
+ m_buttonBox->setStretchFactor(m_buttonFewer, 0);
+
+ QWidget *spacer = new QWidget(m_buttonBox);
+ m_buttonBox->setStretchFactor(spacer, 1);
+
+ m_buttonClear = new KPushButton(KGuiItem(i18n("clear widgets", "Clear"), "locationbar_erase"), m_buttonBox);
+ m_buttonBox->setStretchFactor(m_buttonClear, 0);
+
+ // Connect signals
+ connect(m_buttonMore, SIGNAL(clicked()), this, SLOT(slotMore()));
+ connect(m_buttonFewer, SIGNAL(clicked()), this, SLOT(slotFewer()));
+ connect(m_buttonClear, SIGNAL(clicked()), this, SLOT(slotClear()));
+
+ enableControls();
+}
+
+WidgetLister::~WidgetLister()
+{
+}
+
+void WidgetLister::slotMore()
+{
+ addWidget();
+ enableControls();
+}
+
+void WidgetLister::slotFewer()
+{
+ removeWidget();
+ enableControls();
+}
+
+void WidgetLister::clear()
+{
+ setNumberShown(m_minWidgets);
+
+ // Clear remaining widgets
+ QPtrListIterator<QWidget> i(m_widgetList);
+ for (i.toFirst(); i.current(); ++i)
+ clearWidget((*i));
+
+ enableControls();
+ emit clearWidgets();
+}
+
+void WidgetLister::slotClear()
+{
+ clear();
+}
+
+void WidgetLister::addWidget(QWidget *widget)
+{
+ if (!widget)
+ widget = createWidget(this);
+
+ m_layout->insertWidget(m_layout->findWidget(m_buttonBox), widget);
+ m_widgetList.append(widget);
+ widget->show();
+
+ enableControls();
+ emit widgetAdded(widget);
+}
+
+void WidgetLister::removeWidget()
+{
+ m_widgetList.removeLast();
+
+ enableControls();
+ emit widgetRemoved();
+}
+
+void WidgetLister::clearWidget(QWidget *widget)
+{
+ Q_UNUSED(widget)
+}
+
+QWidget *WidgetLister::createWidget(QWidget* parent)
+{
+ return new QWidget(parent);
+}
+
+void WidgetLister::setNumberShown(int number)
+{
+ int superfluousWidgets = QMAX((int) m_widgetList.count() - number, 0);
+ int missingWidgets = QMAX(number - (int) m_widgetList.count(), 0);
+
+ // Remove superfluous widgets
+ for (; superfluousWidgets; superfluousWidgets--)
+ removeWidget();
+
+ // Add missing widgets
+ for (; missingWidgets; missingWidgets--)
+ addWidget();
+}
+
+void WidgetLister::enableControls()
+{
+ int count = m_widgetList.count();
+ bool isMaxWidgets = (count >= m_maxWidgets);
+ bool isMinWidgets = (count <= m_minWidgets);
+
+ m_buttonMore->setEnabled(!isMaxWidgets);
+ m_buttonFewer->setEnabled(!isMinWidgets);
+}
+
+}
diff --git a/kftpgrabber/src/widgets/widgetlister.h b/kftpgrabber/src/widgets/widgetlister.h
new file mode 100644
index 0000000..8aac58f
--- /dev/null
+++ b/kftpgrabber/src/widgets/widgetlister.h
@@ -0,0 +1,177 @@
+/*
+ * This file is part of the KFTPGrabber project
+ *
+ * Copyright (C) 2003-2006 by the KFTPGrabber developers
+ * Copyright (C) 2003-2006 Jernej Kos <kostko@jweb-network.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and
+ * NON-INFRINGEMENT. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ *
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+#ifndef KFTPWIDGETSWIDGETLISTER_H
+#define KFTPWIDGETSWIDGETLISTER_H
+
+#include <qwidget.h>
+#include <qptrlist.h>
+
+class QPushButton;
+class QVBoxLayout;
+class QHBox;
+
+namespace KFTPWidgets {
+
+/**
+ * This class has been adopted from KDEPIM with slight functional and style
+ * changes.
+ *
+ * @author Jernej Kos
+ * @author Marc Mutz <marc@mutz.com>
+ */
+class WidgetLister : public QWidget
+{
+Q_OBJECT
+public:
+ /**
+ * Class constructor.
+ *
+ * @param parent Parent widget
+ * @param minWidgets Minimum number of widgets in the list
+ * @param maxWidgets Maximum number of widgets in the list
+ */
+ WidgetLister(QWidget* parent, int minWidgets, int maxWidgets);
+
+ /**
+ * Class destructor.
+ */
+ virtual ~WidgetLister();
+
+ /**
+ * Clears all widgets.
+ */
+ void clear();
+
+ /**
+ * Sets the number of currently shown widgets on screen.
+ *
+ * @param number The number of widgets that should be visible
+ */
+ virtual void setNumberShown(int number);
+protected slots:
+ /**
+ * Called whenever the user clicks on the 'more' button. Reimplementations
+ * should call this method, because this implementation does all the dirty
+ * work with adding the widgets to the layout (through @ref addWidget)
+ * and enabling/disabling the control buttons.
+ */
+ virtual void slotMore();
+
+ /**
+ * Called whenever the user clicks on the 'fewer' button. Reimplementations
+ * should call this method, because this implementation does all the dirty
+ * work with removing the widgets from the layout (through @ref removeWidget)
+ * and enabling/disabling the control buttons.
+ */
+ virtual void slotFewer();
+
+ /**
+ * Called whenever the user clicks on the 'clear' button. Reimplementations
+ * should call this method, because this implementation does all the dirty
+ * work with removing all but @ref m_minWidgets widgets from the layout and
+ * enabling/disabling the control buttons.
+ */
+ virtual void slotClear();
+protected:
+ /**
+ * Adds a single widget. Doesn't care if there are already @ref m_maxWidgets
+ * on screen and whether it should enable/disable any controls. It simply does
+ * what it is asked to do. You want to reimplement this method if you want to
+ * initialize the the widget when showing it on screen. Make sure you call this
+ * implementaion, though, since you cannot put the widget on screen from derived
+ * classes (@p m_layout is private). Make sure the parent of the QWidget to add is
+ * this WidgetLister.
+ *
+ * @param widget The widget that should be added
+ */
+ virtual void addWidget(QWidget *widget = 0);
+
+ /**
+ * Removes a single (always the last) widget. Doesn't care if there are still only
+ * @ref m_minWidgets left on screen and whether it should enable/disable any controls.
+ * It simply does what it is asked to do. You want to reimplement this method if you
+ * want to save the the widget's state before removing it from screen. Make sure you
+ * call this implementaion, though, since you should not remove the widget from
+ * screen from derived classes.
+ */
+ virtual void removeWidget();
+
+ /**
+ * Called to clear a given widget. The default implementation does nothing.
+ *
+ * @param widget The widget that should be cleared
+ */
+ virtual void clearWidget(QWidget *widget);
+
+ /**
+ * This method should return a new widget to add to the widget list.
+ *
+ * @param parent The parent widget
+ * @return A valid QWidget
+ */
+ virtual QWidget *createWidget(QWidget *parent);
+protected:
+ QPtrList<QWidget> m_widgetList;
+ int m_minWidgets;
+ int m_maxWidgets;
+signals:
+ /**
+ * This signal is emitted whenever a widget gets added.
+ */
+ void widgetAdded(QWidget *widget);
+
+ /**
+ * This signal is emitted whenever a widget gets removed.
+ */
+ void widgetRemoved();
+
+ /**
+ * This signal is emitted whenever the clear button is clicked.
+ */
+ void clearWidgets();
+private:
+ void enableControls();
+
+ QPushButton *m_buttonMore;
+ QPushButton *m_buttonFewer;
+ QPushButton *m_buttonClear;
+ QVBoxLayout *m_layout;
+ QHBox *m_buttonBox;
+};
+
+}
+
+#endif
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..d6dbcb8
--- /dev/null
+++ b/subdirs
@@ -0,0 +1,2 @@
+kftpgrabber
+translations
diff --git a/translations/Makefile.am b/translations/Makefile.am
new file mode 100644
index 0000000..16f8b81
--- /dev/null
+++ b/translations/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= ar bg br cs cy da de el en_GB es et fr ga gl hu it ja ka lt nl pl pt rw sk sr sr@Latn sv tr zh_CN
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/kftpgrabber.po b/translations/ar/messages/kftpgrabber.po
new file mode 100644
index 0000000..a0b4234
--- /dev/null
+++ b/translations/ar/messages/kftpgrabber.po
@@ -0,0 +1,2886 @@
+# translation of kftpgrabber.po to Arabic
+#
+# محمد سعد Mohamed SAAD <metehyi@free.fr>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-11-17 13:34+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "يحتوي على"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "لا يحتوي على"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "يساوي"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "لا يساوي"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "هو"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "ليس هو"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "الدليل"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "هو أكبر من"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "هو أصغر من"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "بايتات"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "الرجاء إختر العمل."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "الأولوية:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "نزّل"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "حمّل"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr ""
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "إسم الملف"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "نوع الخانة"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "الحجم"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "غيير الأولوية"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr ""
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr ""
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr ""
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr ""
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "المطوّر الرئيسي"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "المطوّر"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr ""
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr ""
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "تصميم الأيقونة"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "الإختبار و كشف الخلل"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr ""
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr ""
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "فشل تسجيل الدخول إلى الخادم"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr ""
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr ""
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "فشل النقل لسبب ما."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr ""
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr ""
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr ""
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr ""
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr ""
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr ""
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr ""
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr ""
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr ""
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr ""
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr ""
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr ""
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr ""
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr ""
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr ""
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr ""
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr ""
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr ""
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr ""
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr ""
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr ""
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr ""
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr ""
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr ""
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr ""
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr ""
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr ""
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr ""
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr ""
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "أعرض حجم الدليل"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr ""
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr ""
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr ""
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr ""
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr ""
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr ""
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr ""
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr ""
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr ""
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr ""
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "أعرض حجم الدليل"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "أعرض حجم الدليل"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "القائمة الرئيسية"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr ""
+
+#~ msgid "Webpage design"
+#~ 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/kftpgrabber.po b/translations/bg/messages/kftpgrabber.po
new file mode 100644
index 0000000..814ac94
--- /dev/null
+++ b/translations/bg/messages/kftpgrabber.po
@@ -0,0 +1,2966 @@
+# translation of kftpgrabber.po to Bulgarian
+# translation of kftpgrabber.po to
+#
+# root <root@localhost.localdomain>, 2005.
+# Zlatko Popov <zlatkopopov@fsa-bg.org>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-12-12 21:07+0200\n"
+"Last-Translator: Zlatko Popov <zlatkopopov@fsa-bg.org>\n"
+"Language-Team: Bulgarian <dict@linux.zonebg.com>\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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "съдържащ"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "не съдържащ"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "равен"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "не е равен"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "съвпада с regexp"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "не съвпада с regexp"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "е"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "не е"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Директория"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "е по-голяма от"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "е по-малка от"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "байта"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Моля, изберете действие."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Приоритет:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Сваляне"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Качване"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Неизвестен таг при обработка на команди!"
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Исканата операция беше неуспешна! Отговор от сървъра:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr "<qt>Не може да бъде намерен <b>%1</b> за обратна обработка!</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Име на файл"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Тип запис"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Размер"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Промяна на приоритета"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Пропускане при поставяне на опашката"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Оцветяване в списъка"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Скриване от списъка"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Местоназначение (малки букви)"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Неименувано правило"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP импортиране"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber импортиране"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp импортиране"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "Импортиране от FileZilla 3"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Всички задачи за прехвърляне са завършени."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Файлът съществува"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - FTP клиент за KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Допълнителен за адрес за връзка"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Водещ разработчик"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Разработчик"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH код"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc код"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon код на изскачащо меню"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Диаграма на трафика"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Дизайн на икона"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Тестване и откриване на грешки"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Код за обработка на директория"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Код за списъка с колони"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Прехвърлянето на следните файлове е завършено:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Връзката към сървъра беше прекъсна."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Влизането в сървъра беше неуспешно"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Файлът-източник не може да бъде открит."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Недостатъчни права."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Не може да бъде отвори файлът за писане."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Прехвърлянето беше прекъснато по някаква причина."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Прехвърлянето на следните файлове <b>беше прекъснато</b> "
+"тъй като няма достатъчно свободно на \"%1\":"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Не може да бъде установена SSH връзка (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Влизане..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Установена връзка със сървъра, опит за влизане..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Влизането беше неуспешно."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Успешно разпозната клавиатура."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Успешно разпознат публичен ключ."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Не може да бъде инициализиран SFTP канал."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Не може да бъде инициализиран SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Връзка."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Свързване..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Свързване към %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Прекъснато."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Използване на кеша на директорията."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Изтегляне на списъка на директорията..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Прехвърляне..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Сваляне на файл \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Качване на файл \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Премахване..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Преименуване..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Промяна на режима..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Връзката беше неуспешна."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr "SSL - успех. Връзката е подсигурена чрез %1 битов %2."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL - неуспех. Влизането беше прекъснато."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL - заявката беше неуспешна. Влизането беше прекъснато."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL - неуспех. Връзката беше прекъсната."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Установена връзка със сървъра, изчакване за съобщение..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Не може да бъде установена връзка (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr "Несъвместим адрес за PORT, но EPRT не се поддържа. Прекъсване!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Установяване на връзка с %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Не може да бъде установен сокет за прослушване."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Изчакване за връзка на порт %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Връзката е установена."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "каналът е подсигурен чрез %1 битов SSL."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr "SSL - неуспех при отварянето на канал. Прехвърлянето беше прекъснато."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Прехвърлянето е завършено."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Създаване на директори..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr "Сървърът не поддържа SSCN/CPSV - трансферът е прекъснат!"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Прехвърляне на файл \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Прехвърляне - поддръжка..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Изключен."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Времето за връзката изтече."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Неактивен."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Сканирането е завършено."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Рекурсивно сканиране на на директорията..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Изчакване %1 секунди преди повторно свързване..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Изчакване..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Повторно свързване (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Повторно свързване..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Повторният опит е прекратен."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Действия при наличие на файл (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Големина/Времева маркировка"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Същото"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "По-стар"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "По-нов"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "По-малък"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "По-голям"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Пропускане"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Презапис"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Продължаване"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Преименуване"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Питане"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Регистриране (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Локална сесия"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Регистриране"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Връзката с %1 е установена успешно."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Предоставете паролата на разшифроващия си публичен ключ."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Сесия"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Поне по една сесия трябва да остане отворена от всяка страна."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Довършете всички прехвърляния преди да затворите сесията."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Тази сесия е свързана към Интернет. Сигурни ли сте, че искате да я прекъснете?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Затваряне на сесия"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Бързо &свързване..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Нова сесия"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Лява страна"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Дясна страна"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Режим на &прехвърляне (Авто)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Двоичен"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Автоматично"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Режим на &прехвърляне (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Режим на &прехвърляне (Двоичeн)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Избор..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Няма име"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Прехвърляне"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Описание"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Няма неуспешни прехвърляния."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Рестартиране на прехвърлянето"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Добавяне към опашката"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Добавяне на всички към опашката"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Премахване"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Премахване на всички"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Сигурни ли сте, че искате да премахнете това неуспешно прехвърляне?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Сигурни ли сте, че искате да премахнете всички неуспешни прехвърляния?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Форма1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Нов шаблон"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Име на шаблон:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Цвят:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Бързо свързване"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Изчистване на списъка със последно посетените сайтове?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "име на хост"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "валиден порт"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "Вашето име"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "Вашата парола"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " и"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Моля, въведете"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Предоставете вашата Х509 сертифицираща парола за разшифроване."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Близки сайтове"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Няма публикувани сайтове."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Шаблон"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Цвят"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Добавяне на шаблон"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Включено"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Осветяване"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Все още не е приложено.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Прескачане на списъка"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII разширения"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Основен"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Прехвърляния"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Показване"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Действия"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Филтри"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Сверяване на контролни суми"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Контролна сума"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Проверката е завършена!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Не може да бъде отворен файлът с контролната сума или файлът е с невалиден "
+"формат!"
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "&Включване на филтъра"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Няма филтри."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Качване"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Сваляне"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Преименуване..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Нов"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Преименуване на правило"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Преименуване на правило \"%1\" в:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Условия"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Съвпадение със &всички от следните"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Съвпадение със &някои от следните"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Търсене и заместване"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Употреба на честотна лента"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Още"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "По-малко"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Изчистване"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "забавен"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "работещ"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Изчакване за свързване..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Филтър: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Име"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Източник"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Местоназначение"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Напредък"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Скорост"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Нямате файлове на опашката."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Сваляне"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "Качване"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Нишки"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Стартиране на прехвърлянето"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Прекратяване на прехвърлянето"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Премахване на &всички"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Преместване на&горе"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Преместване на&долу"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Преместване &отгоре"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Преместване &отдолу"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Промяна на информацията за прехвърлянето"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Заре&ждане на опашката от файл"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Запис на опашката във файл"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Стартиране"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Пауза"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Добавяне на прехвърляне..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Търсене и заместване..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Показване на &филтъра"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Сайт"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Сигурни ли сте, че искате да премахнете чакащите файл(ове)?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Сигурни ли сте, че искате да премахнете ВСИЧКИ чакащи файлове?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Зареждането на нова опашка ще презапише старата. Сигурни ли сте, че искате да "
+"продължите?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Зареждане на опашка"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Сесия на сайт [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Нишка %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "неактивен"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "изключен"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "свързване"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "прехвърляне"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Статус"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Няма активни нишки."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Няма отметки."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Нов..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Преименуване"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Създаване на подкатегория..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Дублиране"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr "Моля, напишете има и парола за връзка към тази страница."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Страница:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Име на категория"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Преименуване на категория:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Ново име на категория"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Нова категория:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Нов сървър"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Нов сървър"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Сигурни ли сте, че искате да премахнете тази категория?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Сигурни ли сте, че искате да премахнете този сървър?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Не може да бъде зареди избраната импортираща приставка."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Избраният файл не съществува или е нечетлив."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Импортирането на отметки приключи."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Редактиране..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Настройки на SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Импортиране..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Експортиране..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Редактор на FTP отметки"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Ще експортирате вашите KFTPGrabber отметки. Те могат да съдържат пароли или "
+"важни X509 сертификати; експортирането на отметките може да компрометира "
+"сигурността им."
+"<br>"
+"<br>Сигурни ли сте?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Експортиране на отметките"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Прекъсване"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "П&оказване на дървовиден изглед"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Свойства"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "Пар&ченце"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Опции за &филтри"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Винаги &пропускане на този файл при поставяне на опашката"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Увеличаване приоритета на този файл до &най-висок"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Намаляване приоритета на този файл до &най-нисък"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "П&рехвърляне"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Прехвърляне на &опашката"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Създаване на директория..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Отваряне на файл"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Сверяване..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "По&вече действия"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "&Ръчно въвеждане на команда..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Експортиране на списъка на директорията..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Показване на &скритите файлове и директории"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Отваряне на текущата директория в &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Сравняване на %маркираните елементи"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "&Сравняване на директории"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Изпращане на &необработена команда (Raw)"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Промяна на сайт"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Бързо свързване..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Свързване към"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Прекъсване на връзката"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Промяна на отдалеченото &кодиране"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Сигурни ли сте, че искате да прекъснете текущата връзка?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Сигурни ли сте, че искате да разделите на парченца този файл?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Разделяне на парченца"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Наистина ли искате да изтриете елемента?\n"
+"Наистина ли искате да изтриете тези %n елемента?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Изтриване на файлове"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Пропускане на \"%1\""
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Приоритет \"%1\""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Създаване на директория"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Име на директория:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Изпращане на необработена команда (Raw)"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Команда:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Експортиране на списъка на директорията"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Идентичните файлове от двете страни бяха скрити. Видими са само <b>"
+"различните файлове</b>."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Основен"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Отдалечена директория"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Непознат"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Тип:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Местоположение:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Размер:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Създаден:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Права"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Права за достъп"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Клас"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Показване\n"
+"на елементите"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Четене"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Записване\n"
+"на елементите"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Записване"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Въвеждане"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Изпълнение"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Специален"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Потребител"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Група"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Други"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Задаване на UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Задаване на GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Лепкав"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Прилагане на промените за всички поддиректории и съдържанието им"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Root директория"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Път: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr "Това е SSH шифрована връзка. Не е налична информация за сертификат."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Опции за филтри"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Филтриране на директории"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Филтриране на символните връзки"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Чувствителен регистър"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "Регистриращият модул на <b>KFTPGrabber</b> е инициализиран.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Не може да бъде отвори файлът за писане."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Не може да бъде намерен описателен XML файл на ГПИ %1. Проверете дали "
+"правилно сте инсталирали програмата! Ако имате въпроси, моля, задайте ги на %2."
+"<br>"
+"<br><b>Предупреждение:</b> Текущият ГПИ ще бъде незавършен!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>След затварянето на прозореца KFTPGrabber ще продължи да работи в системния "
+"панел. Използвайте <b>Изход</b> от меню на<b>KFTPGrabber</b> "
+"за да излезете от програмата.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Поставяне в системния панел"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"В момента има прехвърляне.\n"
+"В момента има %n прехвърляния."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Сигурни ли сте, че искате да излезете?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Близки FTP сайтове"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Сайтове в KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Редактиране на отметките..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Сваляне: %1/сек"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Качване: %1/сек"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Опашка"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Неуспешни прехвърляния"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Близки сайтове"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Нишки"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Трафик"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Копие на"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Този файл с отметки е шифрован. Въведете ключ, за да го разшифровате."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Разшифроването на файла с отметки беше неуспешно с предоставения ключ. "
+"Искате ли да <b>презапишете</b> файла с празен такъв?"
+"<br>"
+"<br><font color=\"red\"><b>Предупреждение:</b> Ако го презапишете, всички "
+"отметки ще бъдат загубени.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Неуспешно разшифроване"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Презаписване на файла с отметки"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Въведете ключ за шифроване на файла с отметки."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Няма публикувана услуга>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<Не е наличен DNSSD>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Няма сайтове в KWallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Показване"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Файлов браузър"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Показване на &скритите файлове и директории"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Показване на &дървото с директории"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Показване на ра&змера на файла в байтове (превключване към \"четлив\" формат)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Показване на &притежател и група за всеки файл"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Показване &размера на директорията"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "&Други елементи на интерфейса"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Показване на лява странична лента"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Търсене и заместване в опашката"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Използвайки този диалог можете да направите голямо заменяне на "
+"началните/крайните пътища на чакащите задачи за прехвърляне. <b>"
+"Промяната не може да се отмени</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Какво се търси"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Местоназначение:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Източник:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Търсене само прехвърляния на определен сървър"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Информация за сървъра"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Име на сървъра:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Хост:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Парола:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Потребителско име:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Порт:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Заместване с"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Помощник за импортиране на файл с отметки"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Стъпка 1: <b>Изберете приставка за импортиране</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Изображение"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Изберете подходяща импортираща приставка от списъка по-долу. Всяка приставка "
+"може да импортира различен формат."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Налични импортиращи приставки:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Стъпка 2: <b>Изберете файл с отметки за импортиране</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Изберете файла с отметки от който искате да импортирате. Пътят по подразбиране "
+"е определен от импортиращата приставка."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Път до файла с отметки:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Стъпка 3: <b>Импортиране на отметки...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Моля, изчакайте докато отметките бъдат импортирани."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Състояния на импортирането:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Изглед"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Шрифт и цвят"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Шрифт:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Цвят на клиентската команда:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Цвят на отговора на сървъра:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Цвят на многоредов отговор:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Цвят на съобщенията за грешка:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Цвят на съобщенията за статуса:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Изходни данни"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Файл с изх&одни данни"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Запис на регистъра във файл"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Файл за изходни данни:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Информация за сървъра източник"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Информация за целевия сървър"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Източник:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Местоназначение:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Тип на прехвърляне:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "&Връзка"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP на активната връзка"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Принуждаване на PORT/EPRT да &използва настроеното IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/име на хост:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "&Игнориране на външното IP за връзките с LAN"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Диапазон от портове на активната връзка"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Използване на портове &само от определен интервал от портове"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Минимално портове:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Максимално портове:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Прекъсвания"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Контролиране на паузата на връзката (в секунди):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Пауза при прехвърляне на данните (в секунди):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Ограничение по скорост"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Сваляне (кБ/сек):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Качване (кБ/сек):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Място на &диска"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Проверка за свободно място на диска"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Спиране на прехвърлянето, ако &няма достатъчно свободно място"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Интервал (сек):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Минимално свободно място (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "&Нишки"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Брой нишки на сесия:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Използване на основната връзка за трансфери"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Разни"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Автоматично възстановяване на неуспешните прехвърляния"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Макс. брой опити преди отказване:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Други"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"&Завлачените и пуснати файлове да се слагат на опашката (вместо да се стартира "
+"веднага прехвърлянето)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Пропускане на &празните директории при поставяне на опашката"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Потвърждение п&реди прекъсване"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Име на хост:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Протокол:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP през TLS/SSL (експлицитно)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP през TLS/SSL (имплицитно)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP през SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Етикет на сайта:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Отдалечена директория:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Локална директория:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Анонимно влизане"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "За &напреднали"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "&Изключване на разширен пасивен режим"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Забрана за използване на пасивен режим"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Използване на IP за пасивни връзки"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr "Изключване на \"принудително използване на това IP\" за този сайт"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Използване на STAT за списъците на директориите"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Множество нишки"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Да не се използват множество нишки за този сайт"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Кодиране на сървъра"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Кодиране:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Нов опит && &Поддържане"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "&Повторно свързване при неуспех"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Нов опит"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Брой опити (0 = безброй):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Изчакване между опитите:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Използване на пакетите поддържане (keepalive) за отворена връзка"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Поддържане"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Честота на поддържане (секунди):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII разш&ирения"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Добавяне на разширение"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Разширение:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Разширение"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Последни свързвания"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Изберете свързване:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Въведете целият URL адрес в тази кутийка"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Въведете име за FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "А&нонимно влизане"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Проверка за анонимно влизане"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Въведете потребителско име за профила"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Въведете парола за профила"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Добавяне към &файла с отметките"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Разширени"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Настройки на връзката"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Режим:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Винаги шифроване на канала с данни"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Шифроване само на писъците с директориите"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Без шифроване на канала с данни"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Сертификат Х509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Използване на следния SSL сертификат при свързване"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Път:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "&Е-поща"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Използване на е-поща от контролния център"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Е-поща:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Стартиране и изход"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Потвърждение за из&ход от програмата, ако има активни задачи"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Стартиране на програмата &минимизирана в системния панел"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Показване на &начален екран при стартиране"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Показване на иконата в &системния панел"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "&Изход при натискане на бутона Х"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Настройки по подразбиране на сайта"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "&Шифроване на файла с отметки"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "&Показване на сайтовете от KWallet заедно с отметките"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Известяване"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Балони"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "&Показване на балонче след завършване на прехвърляне"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Показване само когато опа&шката е празна след прехвърляне"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Показване на балон при успешно по&вторното свързване"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Файл:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "никой"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Списък с файлове"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Необработен"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "ОК"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Не е открит"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Неуспешно"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Големината на основния прозорец."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Позиция на основния прозорец на екрана."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Брой опити по подразбиране за нови сайтове."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Изчакване между опитите по подразбиране за новите сайтове."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Показване на балон при завършването на някои действия."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Показване на балон, когато всички задачи в опашката са завършени."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Показване на балон, когато връзката към сървъра е установена успешно след "
+"повторно свързване."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Потвърждение за изход от потребителя ако има текущо прехвърляне."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Статус на шифроване на файла с отметки."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Локална директория по подразбиране."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Дали да се излезе от програмата при натискане на бутона Х."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Стартиране на програмата минимизирана."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Показване на начален екран при стартиране на програмата."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Показване на икона в системния панел."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Показване на сайтовете от KWallet заедно с отметките."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Показване на диалог за потвърждаване на прекъсването на връзката всеки път, "
+"когато е заявено прекъсване."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Кодировка по подразбиране за сайта."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Последни сайтове, посетени чрез бърза връзка."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Списък с образци на файлове, когато се използва режим ASCII при прехвърляне."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Прескачане на празните директории."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Шрифт за регистъра."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Цвят за командите, изпращани към сървъра."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Цвят за отговорите, изпращани от сървъра."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Цвят за многоредовите отговори, изпращани от сървъра."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Цвят на съобщенията за грешки."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Цвят на съобщенията за статус."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Записване и на регистъра във файл."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Файл, в който да се записва регистъра."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Избиране на порт от определен диапазон от портове при активни прехвърляния."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Начало на диапазон от портове."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Край на диапазона от портове."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Пренебрегване на IP при активни задачи."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "Изпращане на IP при пренебрегване на команда PORT."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Дали външното IP да бъде игнорирано за връзките с LAN."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Поставяне на прехвърляния в опашката на задачите вместо стартирането им при "
+"влачене и пускане."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Проверка за свободно място от kftpgrabber и прекъсване на прехвърлянето ако "
+"няма достатъчно такова."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Интервал за проверка на диска."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Минимално налично свободно място (в MiB)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Използване на глобалната е-поща на KDE за анонимни пароли."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "Е-поща, която да се използва за анонимни пароли."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Брой нишки по време на прехвърляне."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Дали основната връзка да се използва за трансфери."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Пауза (в секунди) за контролираните връзки."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Пауза (в секунди) при прехвърляне на данни."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Общо ограничение на скоростта на сваляне (кБ/сек)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Общо ограничение на скоростта на качване (кБ/сек)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Дали неуспешните трансфери да бъдат автоматично подновявани."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr "Максимален брой нови опити преди прекъсване на трансфера."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Показване по подразбиране на дървото на директориите."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Показване на скритите файлове при разглеждане."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr "Показване големината на файл в байтове, вместо в \"четлива\" форма."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Показване на притежателя и групата на всеки файл."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Показване размера на директорията."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Показване на лява странична лента."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Основно меню"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Лента за отметките"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Няма определено потребителско име за \"%1\"."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Грешка при свързване"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "Настройки на показване"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "KFTPQuickConnectLayout"
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/kftpgrabber.po b/translations/br/messages/kftpgrabber.po
new file mode 100644
index 0000000..1c2e7a6
--- /dev/null
+++ b/translations/br/messages/kftpgrabber.po
@@ -0,0 +1,3112 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: all2.po\n"
+"POT-Creation-Date: 2007-04-15 07:14+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "ennañ"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "par da"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "'zo"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "n'eo ket"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Renkell"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "'zo bihanoc'h evit"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "okted"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Renk :"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Enkargañ"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Ezkargañ"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Anv ar restr"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Ment"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "&Kemmañ al lec'hienn"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Dehaezadur"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Enporzh gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Enporzh KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Enporzh NcFtp"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Ar restr a zo endeo"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr ""
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Diorrer kentañ"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Diorrer"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Kod LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Kod otpCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr ""
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr ""
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Anv ar renkell :"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Sac'het eo kevreadur ouzh ar servijer."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Sac'het eo ereañ ouzh ar servijer."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "N'eo ket bet kavet ar restr tarzh."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Aotre nac'het"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "N'hellan ket digeriñ ar restr evit skrivañ."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Oc'h ereañ ..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Sac'het eo an ereañ."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Kevreet."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Emaon o kevreañ ouzh ..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Emaon o kevreañ ouzh %1:%2 ..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Dilaoskelet."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "O treuzkas ..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Oc'h enkargañ ar restr '%1' ..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Oc'h ezkargañ ar restr '%1' ..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Emaon o tilemel ..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Oc'h adenvel ..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Sac'het eo ar gevreadenn."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "N'hellan ket kevreañ (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Klask adarre gant ar gevreadenn (%1/%2) ..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Emaon o c'hortoz evit ar gevreadenn ..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Echu eo an treuzkas."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "O krouiñ ar renkell ..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Oc'h ezkargañ ar restr '%1' ..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Digevreet."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Kouezhet eo ar gevreadenn."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr ""
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Echu eo an treuzkas FXP."
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Emaon o tielfennañ ar renkelloù ..."
+
+#: src/engine/connectionretry.cpp:66
+#, fuzzy
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Emaon o c'hortoz evit ar gevreadenn ..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "O c'hortoz ..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Klask adarre gant ar gevreadenn (%1/%2) ..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Klask adarre gant ar gevreadenn ..."
+
+#: src/engine/connectionretry.cpp:93
+#, fuzzy
+msgid "Retry aborted."
+msgstr "Dilaoskelet."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Koshoc'h"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Neveshoc'h"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Bihanoc'h"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Brasoc'h"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Tremen e-biou"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Rasklañ"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Kenderc'hel"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Adenvel"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Goulenn"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Kerzlevr (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Dalc'h lec'hel"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Kerzlevr"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr ""
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Dalc'h"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Serriñ an dalc'h"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "&Kevreañ buan ..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Dalc'h nevez"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr ""
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr ""
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr ""
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binarel"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Emgefreek"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Mod &treuzkas (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Mod &treuzkas (binarel)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Dibabit ..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Anv ebet"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Treuzkas"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Deskrivadur"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Adloc'han an treuzkas"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Ouzhpennañ d'al lost"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "L&emel"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Lemel an holl re"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Paperenn-reol 1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Sil nevez"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Sil anv restr :"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Liv :"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Kevreañ ent buan"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "un anv ostiz"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "ur borzh mat"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "ho anv arveriad"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "ho tremenger"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " ha "
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Roit mar plij "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Lec'hiennoù tost deoc'h"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Sil"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Liv"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Ouzhpennañ ur sil"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Bev"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Astennoù ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Pennañ"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Diskwel"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Oberoù"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Siloù"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr ""
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr ""
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Sil &bevet"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Siloù"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Uhel"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Izel"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Adenvel ..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Nevez"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Adenvel ar reolin"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Kevreade&nn"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Klask & Erlec'hiañ"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Muioc'h"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Nebeutoc'h"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Goullonderiñ"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "emaon o seveniñ"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Emaon o c'hortoz evit ar gevreadenn ..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Sil : "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Anv"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Tarzh"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Dehaezadur"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Araogenn"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Tizh"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "Izel : "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "Uhel : "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "Neudoù : "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Lemel an &holl re"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "&Pignit"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "&Diskennit"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "&Pignit"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Fiñval d'an &traoñ"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Kargañ al lost eus ur restr"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Enrollañ ar lost en ur restr"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "L&oc'hañ"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Ehan"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Klask/Erlec'hiañ ..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Diskouez ar &sil"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Lec'hienn"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Kargañ al lost"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Dalc'h al lec'hienn [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Neudenn %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "digevreet"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "emaon o kevreañ"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "o treuzkas"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Stad"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Sined ebet."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nevez ..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Adenvel"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Krouiñ un isrumm ..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Eilañ"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Lec'hienn :"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Anv ar rumm"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Adenvel ar rumm :"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Anv rumm nevez ..."
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Rumm nevez :"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Servijer nevez"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Servijer nevez"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Ha sur oc'h bezañ mennet da zilemel ar rumm-mañ ?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Ha sur oc'h bezañ mennet da zilemel ar servijer-mañ ?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "N'hell ket bet karget al lugent enporzh dibabet."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "N'eo ket endeo ar restr dibabet pe n'eo ket bet lennet."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr ""
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Aozañ ..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Kefluniadur SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Enporzh ..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Ezporzh ..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Aozer sined FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Ezporzh ar sinedoù"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "N'hellan ket mont er renkell %1."
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Paouez"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Diskouez ar wel gwezenn"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Perzhioù"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Dibarzhoù ar s&il"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Treuzkas"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Krouiñ ur renkell ..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Digeriñ ur restr"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Gwiriekaat ..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Ezporzhañ roll restroù ar renkell ..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Diskouez ar restroù hag ar renkelloù &kuzhet"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Krouiñ ur renkell"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Kemmañ al lec'hienn"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Kevreañ &buan ..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Kevreañ ouzh"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Digevreañ"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr "Ha fellout a ra deoc'h da vat lemel an %n dra dibabet ?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Distruj restroù"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Tremen e-biou"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Renk"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Krouiñ ur renkell"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Anv ar renkell :"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Urzhiad :"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Ezporzhañ roll restroù ar renkell"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Pennañ"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Renkell a-bell"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Dianav"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Rizh :"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Lec'hiadur :"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Ment :"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Krouet :"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Aotreoù"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Aotreoù moned"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Renkad"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Diskouez\n"
+"ar bouetaduroù"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Lenn"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Skrivañ\n"
+"enmontoù"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Skrivañ"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Mont"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Seveniñ"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Dibar"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Arveriad"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Strollad"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Ar re all"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Lakaat an UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Lakaat ar GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Pegañ"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Renkell gwrizienn"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Hent : "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Dibarzhoù ar sil"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Krouiñ ur renkell"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Roll ar restroù"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Evezhiek ouzh ar c'hef"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "N'hellan ket digeriñ ar restr evit skrivañ."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Emaon oc'h ensoc'hañ e barlenn ar reizhiad"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Hag e fell deoc'h kuitaat da vat ?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr ""
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Lec'hiennoù e KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Aozañ ar sinedoù ..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Enkargañ : %1/e"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Ezkargañ : %1/e"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Lost"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr ""
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Lec'hiennoù tost din"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Neudoù"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Eil"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Rasklañ ar sinedoù"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Lec'hienn ebet e KWallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Diskwe&l"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Furcher ar restroù"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Diskouez ar restroù hag ar renkelloù &kuzhet"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Diskouez gwezenn ar &renkelloù"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Diskouez gwezenn ar &renkelloù"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Diskouez ar &sil"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Dehaezadur :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Tarzh :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Titouroù diwar-benn ar servijer"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Anv ar servijer :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Ostiz :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Tremenger :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Anv an arveriad :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Porzh :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Erlec'hiañ gant"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Skoazeller enporzh sinedoù"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Prantad 1 : <b>Dibabit ul lugent enporzh"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Skeudenn"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Lugentoù enkas da gaout :"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Prantad 2 : <b>Dibabit ar restr sil da enporzh</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Prantad 3 : <b>Oc'h enporzh ar sinedoù ...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Neuziadur"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Ment && Livioù"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Nodrezh :"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Liv kemennad fazi :"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Liv ar c'hemennadoù stad :"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Ezkas"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Restr ezkas :"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Titouroù diwar-benn ar servijer dehaezadur"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Tarzh :</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Dehaezadur :</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Seurt an treuzkas :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Kevreade&nn"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP ar gevreadenn bev"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/anv an ostiz :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Tizh-harzh"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Enkargañ (Ko/s) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Ezkargañ (Ko/s) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Egor p&ladenn"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Egor dieub Izelañ (Mio) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Neud&où"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "A bep &seurt"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "All"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "Perzhioù al lec'hienn ftp"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Anv an ostiz :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Komenad :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP war SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Skridennad al lec'hienn :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Renkell a-bell :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Renkell lec'hel :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "Ereañ &dizanv"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Barek"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kodadur :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Klask adarre"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "A&stennoù ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Ouzhpennañ un astenn"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Astenn :"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Astenn"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Klask adarre gant ar gevreadenn ..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Klask adarre gant ar gevreadenn ..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL :"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Roit anv ostiz ar ftp"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Ereañ dizanv"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Roit anv arveriad ar gont"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Roit tremenger ar gont"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Ouzhpennañ d'ar &sinedoù"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Barek"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Sac'het eo kevreadenn roadoù (%1)."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Giz :"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Ezporzhañ roll restroù ar renkell"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Hent :"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "Chomlec&'h postel"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Postel :"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Diskouez ar skramm-&degemer pa loc'her"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Kemenn"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Restr :</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "hini ebet"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Roll ar restroù"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Mat eo"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "N'eo ket kavet"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Sac'het"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Renkell lec'hel dre ziouer."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Liv kemennad fazi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Liv ar c'hemennadoù stad."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Diskouez gwezenn ar &renkelloù"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Diskouez ar &sil"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Meuziad kentañ"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barrenn ostilhoù ar Sinedoù"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "N'eus anv arveriad roet evit '%1'."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Fazi en ur kevreañ"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Diskwel"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Kevreañ ent buan"
+
+#~ msgid "Command"
+#~ msgstr "Urzhiad"
+
+#~ msgid "What's this?"
+#~ msgstr "Petra zo ?"
+
+#~ msgid "Server Management"
+#~ msgstr "Mererezh ar servijerien"
+
+#~ msgid "Username"
+#~ msgstr "Anv an arveriad"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Roit anv an arveriad pe nullit"
+
+#~ msgid "Group name"
+#~ msgstr "Anv ar strollad"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Roit ur strollad pe nullit"
+
+#~ msgid "Description name"
+#~ msgstr "Anv an deskrivadur"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Roit ur deskrivadur pe nullit"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "An tremegerioù ne glot ket"
+
+#~ msgid "Optional"
+#~ msgstr "Diret"
+
+#~ msgid "Password retype:"
+#~ msgstr "Roit ho tremenger adarre :"
+
+#~ msgid "Change user's password"
+#~ msgstr "Kemmañ tremenger an arveriad"
+
+#~ msgid "Readd user"
+#~ msgstr "Adouzhpennañ an arveriad"
+
+#~ msgid "Add a new group"
+#~ msgstr "Ouzhpennañ ur strollad nevez"
+
+#~ msgid "Delete a group"
+#~ msgstr "Lemel ur strollad"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Kemmañ deskrivadur ar strollad"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Kas ar sinedoù da"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Kas ar sinedoù"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Ha sur oc'h bezañ mennet da zilemel ar restr(où)-se ?"
+
+#~ msgid "Date"
+#~ msgstr "Deiziad"
+
+#~ msgid "Permissions"
+#~ msgstr "Aotreoù"
+
+#~ msgid "Owner"
+#~ msgstr "Perc'henn"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "N'hellan ket digeriñ ar renkell '%1'."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Sur out ?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "O treuzkas ..."
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+A"
+
+#~ msgid "GeneralSettings"
+#~ msgstr "Kefluniadur hollek"
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Ouzhpennañ ur sil nevez"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Ha fellout a ra deoc'h da vat lemel ar sil-se ?"
+
+#~ msgid "&Other"
+#~ msgstr "&All"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "&Ouzhpennañ ur sil ..."
+
+#~ msgid "E&dit..."
+#~ msgstr "A&ozañ ..."
+
+#~ msgid "Re&move"
+#~ msgstr "Le&mel"
+
+#~ msgid "E&nabled"
+#~ msgstr "B&ev"
+
+#~ msgid "Patterns"
+#~ msgstr "Siloù :"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "&Ouzhpennañ ur sil"
+
+#~ msgid "&Low"
+#~ msgstr "&Izel"
+
+#~ msgid "Value:"
+#~ msgstr "Gwerzh :"
+
+#~ msgid "&Skip"
+#~ msgstr "&Tremen e-biou"
+
+#~ msgid "&High"
+#~ msgstr "&Uhel"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "&Lakaat ar sil ..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Goullonderiñ ar sil"
+
+#~ msgid "Filter"
+#~ msgstr "Sil"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Roit ur sul :"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "Aozer sined FTP"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "Kefluniadur TLS/SSL"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Mod treuzkas :"
+
+#~ msgid "Transfer:"
+#~ msgstr "Treuzkas :"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "En : %1/s Ez : %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "O lenn ar renkell dre SFTP ..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "Renkell SFTP kemmet da « %1 »"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "Sac'het eo an treuzkas FXP."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Ostiz dianav. '%1'."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Digevreet diouzh ar servijer."
+
+#~ msgid "Error reading file."
+#~ msgstr "Fazi en ur lenn ar restr."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "N'hellan ket kevreañ ouzh ar servijer."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "N'eo ket e grubuilh ar renkell."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "N'hellan ket digeriñ ar renkell."
+
+#~ msgid "Cache"
+#~ msgstr "Krubuilh"
+
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Bevaat krubuilh endalc'had ar &renkell"
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/kftpgrabber.po b/translations/cs/messages/kftpgrabber.po
new file mode 100644
index 0000000..0c43e15
--- /dev/null
+++ b/translations/cs/messages/kftpgrabber.po
@@ -0,0 +1,3156 @@
+# translation of kftpgrabber.po to Czech
+# Klara Cihlarova <koty@seznam.cz>, 2005, 2006.
+# Jakub Friedl <jfriedl@suse.cz>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-08-06 19:15+0200\n"
+"Last-Translator: Klara Cihlarova <koty@seznam.cz>\n"
+"Language-Team: Czech <suse@suse.cz>\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"
+"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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "spojování"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Adresář"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Priorita"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Download"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Upload"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Název souboru"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Velikost"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "&Povolit přeskakování"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Cíl"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP import"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber import"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp import"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Všechny přenosy ve frontě byly dokončeny."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Soubor existuje"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - FTP klient pro KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Hlavní vývojář"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Vývojář"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH kód"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc kód"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Kód bubliny KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Design ikony"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr ""
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr ""
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Přenos těchto souborů byl dokončen:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Spojení se serverem selhalo."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Přihlášení k serveru selhalo"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Přístup zakázán."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Nemohu otevřít soubor pro zápis."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Přenos následujících souborů <b>byl zrušen</b>, protože na '%1' není dost "
+"místa:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Nelze navázat SSH spojení (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Přihlašuji se..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Přihlášení selhalo."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Nelze inicializovat SFTP kanál!"
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Nelze inicializovat SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Připojen."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Připojuji se..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Připojuji se k %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Přerušeno."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Přenáším..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Odstraňuji..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "přejmenovávám..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Připojení selhalo."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Nelze se připojit (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Spojení navázáno."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Přenos dokončen."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Vytvářím adresář..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Přenáším..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Odpojeno."
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Spojení vypršelo."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Nečinný."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "vyhledávání dokončeno."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Čekám..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Když soubor existuje (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Velikost/Čas"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Stejný"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Starší"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Novější"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Menší"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Větší"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Přeskočit"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Přepsat"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Navázat"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Přejmenovat"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Zeptat se"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Log (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Místní sezení"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Spojení s %1 bylo úspěšně navázáno."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sezení"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Na každé straně musí zůstat nejméně jedno sezení!"
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Dokončete všechny přenosy předtím, než zavřete toto sezení."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "Toto sezení je momentálně připojené. Opravdu chcete odpojit?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Uzavřít sezení"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Ry&chlé připojení..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nové sezení"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Levá strana"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Pravá strana"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&Režim přenosu (auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binární"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Automaticky"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&Režim přenosu (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&Režim přenosu (binární)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Vybrat..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Bez názvu"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Přenést"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Popis"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Žádné chybné přenosy."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Restartovat přenos"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Přidat do fronty"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Přidat vše do fronty"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "O&dstranit"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Odstranit vše"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Opravdu chcete odstranit tento chybný přenos?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Opravdu chcete odstranit VŠECHNY chybné přenosy?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nový vzorec"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Vzorec jména souboru:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Barva:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Rychlé připojení"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "jméno počítače"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "platný port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "vaše uživatelské jméno"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "vaše heslo"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " a"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "zadejte"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Prosím poskytněte heslo k dekódování vašeho X509 certifikátu."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Servery ve vašem okolí"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Žádné servery."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Vzorec"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Barva"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Přidat vzorec"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Povoleno"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Zvýrazňování:"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Zatím neimplementováno</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Seznam přeskakování"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII rozšíření"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Obecné"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Přenosy"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Zobrazení"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Akce"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtry"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Kontrolní součet"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Ověření dokončeno!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Název souboru"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filtry"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Download"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "přejmenovávám..."
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Novější"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Přejmenovat"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Spoje&ní"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Najít a nahradit"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "zastaven"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "běží"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "čekám na připojení..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtr: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Název"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Zdroj"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Cíl"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Průběh"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Rychlost"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Nemáte ve frontě žádné soubory."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Download"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Vlákna"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Zahájit přeno&s"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Z&rušit přenos"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Odstr&anit vše"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Posunout nahor&u"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Posunout &dolů"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Posunout nahor&u"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Změnit &informace o přenosu"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Nahrát frontu ze souboru"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Uložit frontu do souboru"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Start"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pauza"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Při&dat přenos..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Najít a nahradit"
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Zobrazit &filtr"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Opravdu chcete odstranit soubor(y) ve frontě?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Opravdu chcete odstranit VŠECHNY soubor(y) ve frontě?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Nahrát frontu"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr ""
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "nečinný"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "odpojen"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "spojování"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "přenášení"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Stav"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Žádné záložky."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nový..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Přejmenovat"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Vytvořit podkategorii..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Vytvořit kopii"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Stránka:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Jméno kategorie"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Přejmenovat kategorii:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nové jméno kategorie"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nová kategorie:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Nový server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Nový server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Opravdu chcete odstranit tuto kategorii?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Opravdu chcete odstranit tento server?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Import záložek dokončen."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Upravit..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Nastavení SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importovat..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exportovat..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197
+#, fuzzy
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Chystáte se odeslat své KFTPGrabber záložky na <b>%1</b>"
+". Mohou obsahovat hesla nebo X509 certifikáty! Jejich odesláním můžete narušit "
+"jejich bezpečnost."
+"<br>"
+"<br>Jste si jisti?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Exportovat záložky"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Zrušit"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Stromový pohled"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Vlastnosti"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "Ska&rtovat"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Filtry"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Pře&nos"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Přenos &fronty"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "Vytvořit &adresář..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Více akcí"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Zobrazovat &skryté soubory a adresáře"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Vytvořit adresář"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Poslat čistý příkaz"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Rychlé připojení..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Připojit k"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "O&dpojit"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Opravdu chcete přerušit aktuální spojení?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Opravdu chcete SKARTOVAT tento soubor?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Skartovat soubor"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Smazat soubor"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Přeskočit"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Priorita"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Vytvořit adresář"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Název adresáře:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Poslat čistý příkaz"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Příkaz:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Obecné"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Vzdálený adresář"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Neznámý"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Typ:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Umístění:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Velikost:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Vytvořeno:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Práva"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Přístupová práva"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Třída"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Zobrazovat\n"
+"záznamy"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Čtení"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Zapisovat\n"
+"záznamy"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Zápis"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Vstup"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Spouštění"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Special"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Uživatel"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Skupina"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Ostatní"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Nastavit UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Nastavit GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Aplikovat změny na všechny podsložky a jejich obsah"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Kořenový adresář"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Cesta:"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Filtry"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Vytvořit adresář"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Soubor existuje"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr ""
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> logger aktivován.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Nemohu otevřít soubor pro zápis."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Pohlcení v panelu"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Opravdu ukončit?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP servery v okolí"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Stránky v KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Upravit záložky..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Stahování: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Odesílání: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Fronta"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Chybné přenosy"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Servery v okolí"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Vlákna"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Provoz"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopie"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Tento soubor se záložkami je zakódován. Prosím, zadejte klíč pro dešifrování."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Dekódování záložek s tímto heslem selhalo. Chcete <b>přepsat</b> "
+"záložky prázdným souborem?"
+"<br>"
+"<br><font color=\"red\"><b>Varování:</b> Pokud tak učiníte, všechny záložky "
+"budou ztraceny!</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Dekódování selhalo"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Přepsat záložky"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Vložte heslo k zakódování záložek."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Žádné publikované služby>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD není k dispozici>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Žádné stránky v KWallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Martin Sekera,Klára Cihlářová"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "trancelis@centrum.cz,koty@seznam.cz"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Zo&brazení"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Prohlížeč &souborů"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Zobrazovat &skryté soubory a adresáře"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "&Stromový pohled"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "&Stromový pohled"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Zobrazit &filtr"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Najít a nahradit frontu"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Cíl:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Zdroj:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Info o serveru"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Jméno serveru:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Hostitel:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Heslo:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Uživatel:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Nahradit za"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Obrázek"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Vzhled"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Písmo a barvy"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Písmo:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Barva příkazu klienta:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Barva odpovědi serveru:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Barva víceřádkové odpovědi:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Barva chyby:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Barva stavové hlášky:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Výstup"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Uložit záznam do souboru"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Výstupní soubor:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Info o zdrojovém serveru"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Info o cílovém serveru"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Zdroj:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Cíl:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Typ přenosu:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Spoje&ní"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP aktivního spojení"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Vynutit PORT/EPRT a &použít uvedenou IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/jméno počítače:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Rozsah portů aktivního spojení"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Časové limity"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Omezení rychlost"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Stahování (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Odesílání (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "&Místo na disku"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Kontrola volného místa na disku"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Zastavit přenos, pokud již není &dost místa na disku"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Interval (s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimum volného místa (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "V&lákna"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Počet vláken na sezení:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Žádné chybné přenosy."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Ostatní"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Přeskakovat prázdné &adresáře"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Hostitel:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokol:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Název:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Vzdálený adresář:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Místní adresář:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonymní přihlášení"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Pokročilé"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "&Zakázat použití rozšířeného pasivního režimu"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Zakázat použití pasivního režimu"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Pro vypsání adresáře použít STAT"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Kódování serveru:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kódování:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, fuzzy, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Pokusit se znovu připojit v případě selhání"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Opakovat"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Počet opakování (0 = nekonečno):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Prodleva mezi pokusy:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII &rozšíření"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Přidat &rozšíření"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Rozšíření:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Rozšíření"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "spojování"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "spojování"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Zadejte kompletní URL"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Zadejte adresu nebo doménové jméno"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anon&ymní přihlášení"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Zaškrtněte pro přihlášení bez jména a hesla"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Zadejte uživatelské jméno účtu"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Zadejte heslo k účtu"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Přidat do &záložek"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Pokročilé"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Spojení navázáno."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Pro vypsání adresáře použít STAT"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 certifikát"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Použít následující SSL certifikát při připojování"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Cesta:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-mailová &adresa"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Použít e-mailovou adresu z Ovládacího centra"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Spustit a ukončit"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, fuzzy, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Zeptat se na ukončení programu, pokud probíhají přenosy"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, fuzzy, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Spustit program minimalizovaný do traye"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, fuzzy, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Zobrazovat splash při startu"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, fuzzy, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Přeskakovat prázdné adresáře"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, fuzzy, no-c-format
+msgid "Site Defaults"
+msgstr "Výchozí nastavení pro přenosy"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, fuzzy, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Zakódovat soubor se záložkami"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, fuzzy, no-c-format
+msgid "&Notification"
+msgstr "Nastavení upozornění"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Zobrazit bublinu při dokončení přenosu"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, fuzzy, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Zobrazit pouze pokud je fronta již prázdná"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, fuzzy, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Zobrazit bublinu při úspěšném připojení po opakování"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, fuzzy, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Zdroj:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "nic"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, fuzzy, no-c-format
+msgid "File list"
+msgstr "Soubor existuje"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Ok"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Nenalezeno"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, fuzzy, no-c-format
+msgid "Failed"
+msgstr "Selhání"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Zobrazit bublinu při dokončení přenosu"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Zobrazit bublinu při dokončení přenosu"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, fuzzy, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Zeptat se na ukončení programu, pokud probíhají přenosy"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, fuzzy, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Zakódovat soubor se záložkami"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, fuzzy, no-c-format
+msgid "Default local directory."
+msgstr "Výchozí místní adresář:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, fuzzy, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Přeskakovat prázdné adresáře"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, fuzzy, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Přeskakovat prázdné adresáře"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, fuzzy, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Nelze otevřít adresíř!"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, fuzzy, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Počet opakování (0 = nekonečno):"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Zeptat se na ukončení programu, pokud probíhají přenosy"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "&Stromový pohled"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Zobrazit &filtr"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Hlavní menu"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Lišta se záložkami"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Žádné uživatelské jméno není uvedeno pro '%1'."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Chyba spojení"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Zobrazení"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Rychlé připojení"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Nelze vyhledat vhodnou aplikace k otevření souboru!"
+
+#~ msgid "Command"
+#~ msgstr "Příkaz:"
+
+#~ msgid "What's this?"
+#~ msgstr "Co je toto?"
+
+#~ msgid "Server Management"
+#~ msgstr "Správa serveru"
+
+#~ msgid "Username"
+#~ msgstr "Uživatelské jméno"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Zadejte uživatelské jméno nebo stiskněte zrušit"
+
+#~ msgid "Group name"
+#~ msgstr "Skupina"
+
+#~ msgid "Description name"
+#~ msgstr "Popis"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Hesla se neshodují"
+
+#~ msgid "Optional"
+#~ msgstr "Volitelné"
+
+#~ msgid "Password retype:"
+#~ msgstr "Opakovat heslo:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Poslat čistý &příkaz..."
+
+#~ msgid "Change user's password"
+#~ msgstr "Změnit heslo uživatele"
+
+#~ msgid "Add a new group"
+#~ msgstr "Přidat novou skupinu"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Odeslat záložky k"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Žádné kontakty>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Zakázáno v této verzi KDE>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Chystáte se odeslat své KFTPGrabber záložky na <b>%1</b>. Mohou obsahovat hesla nebo X509 certifikáty! Jejich odesláním můžete narušit jejich bezpečnost.<br><br>Jste si jisti?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Odeslat záložky"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Tento server je distribuovaný FTP démon"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Opravdu chcete smazat tento soubor(y)?"
+
+#~ msgid "Date"
+#~ msgstr "Datum"
+
+#~ msgid "Permissions"
+#~ msgstr "Práva"
+
+#~ msgid "Owner"
+#~ msgstr "Vlastník"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Nemohu otevřít adresář '%1'."
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Tento adresář obsahuje 1 soubor.\n"
+#~ "Tento adresář obsahuje %1 soubory.\n"
+#~ "Tento adresář obsahuje %1 souborů."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Zobrazení všeho může chvíli trvat."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Opravdu?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Přenáším..."
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Obecné"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Přidat nový vzorec"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Opravdu chcete odstranit tento vzorec?"
+
+#~ msgid "&Other"
+#~ msgstr "&Jiné"
+
+#, fuzzy
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Přejmenovávat stažené soubory na malá písmena"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Zvý&razňování"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "&Přidat vzorec..."
+
+#~ msgid "E&dit..."
+#~ msgstr "Up&ravit..."
+
+#~ msgid "Re&move"
+#~ msgstr "Od&stranit"
+
+#~ msgid "E&nabled"
+#~ msgstr "Po&volit"
+
+#~ msgid "Patterns"
+#~ msgstr "Vzorce"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "&Přidat vzorec"
+
+#~ msgid "&Low"
+#~ msgstr "Níz&ká"
+
+#~ msgid "Value:"
+#~ msgstr "Hodnota:"
+
+#~ msgid "&Skip"
+#~ msgstr "&Přeskočit"
+
+#~ msgid "&High"
+#~ msgstr "V&ysoká"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Nastavení seznamu přeskakování"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "Přes&kakovat prázdné soubory"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Použít &seznam na adresáře"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Neřadit soubory na seznamu do &fronty"
+
+#, fuzzy
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Neřadit soubory na seznamu do fronty"
+
+#, fuzzy
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Použít seznam na adresáře"
+
+#, fuzzy
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Neřadit soubory na seznamu do fronty"
+
+#, fuzzy
+#~ msgid "Queue directories before files."
+#~ msgstr "Přeskakovat prázdné adresáře"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "Nastavit &filtr..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Vyčistit filtr"
+
+#~ msgid "Filter"
+#~ msgstr "Filtr"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Filtr:"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "Nastavení TLS/SSL"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Režim přenosu:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - soukromý (soukromí i integrita)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - tajný (soukromí bez integrity)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - bezpečný (integrita bez soukromí)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - čistý (bez SSL)"
+
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Spojení selhalo (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Přenos:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Down: %1/s Up: %1/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/kftpgrabber.po b/translations/cy/messages/kftpgrabber.po
new file mode 100644
index 0000000..7c9b7db
--- /dev/null
+++ b/translations/cy/messages/kftpgrabber.po
@@ -0,0 +1,3002 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2007-04-15 07:14+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "cysylltu"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Cyfeiriadur"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Blaenoriaeth"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Lanlwytho"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr ""
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Enw Ffeil"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Maint"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "Blaenoriaeth"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Cyrchfan"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Ffeil yn Bodoli"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr ""
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr ""
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr ""
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Datblygwr"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr ""
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr ""
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr ""
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr ""
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Enw cyfeiriadur :"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr ""
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr ""
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Caniatadau"
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr ""
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Methwyd mewngofnodi."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Cysylltwyd."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Yn cysylltu..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Yn cysylltu â %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Erthylwyd."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Trosglwyddo"
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Ailenwi"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Methwyd mewngofnodi."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Cyfeiriadur gwraidd:"
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Trosglwyddo"
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Datgysylltwyd."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Cysylltiad wedi goramseru."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Segur."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr ""
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Aros ..."
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Yn cysylltu â %1:%2..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Yn cysylltu â %1:%2..."
+
+#: src/engine/connectionretry.cpp:93
+#, fuzzy
+msgid "Retry aborted."
+msgstr "Erthylwyd."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Hepgor"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Trosysgrifo"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Ail-ddechrau"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Ail-enwi"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Gofyn"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr ""
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr ""
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Cofnodion"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr ""
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sesiwn"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Cau Sesiwn"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr ""
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Sesiwn Newydd"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr ""
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr ""
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr ""
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr ""
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Deuaidd"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Ymysgogol"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr ""
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Dewis..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Dim Enw"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Trosglwyddo"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Disgrifiad"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "G&waredu"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Gwaredu Popeth"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Ffurf1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Lliw:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr "a "
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr ""
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Patrwm"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Lliw"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Alluogir"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Amlygu"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Cyffredinol"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Dangos"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Gweithredoedd"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Hidlenni"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Prawfswm"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr ""
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Enw Ffeil"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Hidlenni"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Lawrlwytho"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Ailenwi"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "&Newydd..."
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Ail-enwi"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Cy&sylltiad"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr ""
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "wedi Seibio"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "yn rhedeg"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr ""
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Hidl: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Enw"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Tarddiad"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Cyrchfan"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Cynnydd"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Cyflymder"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Lawrlwytho"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Gwaredu Popeth"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Symud i &Fyny"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Symud i &Lawr"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Symud i &Fyny"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "D&echrau"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Seibio"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Dangos &Hidlen"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Gwefan:"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr ""
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "segur"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "datgysylltwyd"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "cysylltu"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Cyflwr"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Newydd..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Ail-enwi"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Dyblyg"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Gwefan:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Gweinydd Newydd"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Gweinydd Newydd"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr ""
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Golygu..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Mewnforio..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Allforio..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr ""
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Erthylu"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Priodweddau"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Malu"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Hidlenni"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Trosglwyddo"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Agor ffeil"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Gwirio..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Cyfeiriadur gwraidd:"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Datgysylltu"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Dileu Ffeil"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Hepgor"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Blaenoriaeth"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Enw cyfeiriadur :"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Gorchymyn:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Cyffredinol"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Anhysbys"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Math:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Lleoliad:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Maint:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Creuwyd:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Caniatadau"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Caniatadau Cyrchu"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Dosbarth"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+" Dangos\n"
+" Cofnodion"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Darllen"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+" Ysgrifennu\n"
+" Cofnodion"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Ysgrifennu"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Mynd i mewn"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Gweithredu"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Arbennig"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Defnyddiwr"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Gr?p"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Eraill"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Gosod UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Gosod GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Gludiog"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Gosod newidiadau i bob is-blygell a'i gynnwys."
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Cyfeiriadur gwraidd:"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Llwybr: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Hidlenni"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Rhestr ffeiliau"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr ""
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr ""
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr ""
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr ""
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr ""
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Golygu Tudnodau..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Ciw"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr ""
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr ""
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Dangos"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Cyfeiriadur gwraidd:"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Dangos &Hidlen"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Cyrchfan:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Tarddiad:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Enw Gweinydd :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Gwesteiwr:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Cyfrinair:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Enw defnyddiwr:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Porth:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Amnewid Efo"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Delwedd"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Ymddangosiad"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Wynebfath:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Allbwn"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Ffeil allbwn :"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Tarddiad :</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Cyrchfan :</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Cy&sylltiad"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, fuzzy, no-c-format
+msgid "Speed limit"
+msgstr "Cyflymder"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Download (KB/s):"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Lanlwytho"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Arall"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Enw Gwesteiwr:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocol :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Mewngofnodi yn ddi-enw"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Uwch"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Amgodiad:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Ail-geisio..."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Estyniad:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Estyniad"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Yn cysylltu â %1:%2..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Yn cysylltu â %1:%2..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Mewn&gofnodi yn ddi-enw"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Uwch"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Llwybr:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Hysbysiad"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Ffeil:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "dim"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Rhestr ffeiliau"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Iawn"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Heb ei ganfod"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, fuzzy, no-c-format
+msgid "Failed"
+msgstr "Hidlo"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Cyfeiriadur gwraidd:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Dangos &Hidlen"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Bar Tudnodau"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Dangos"
+
+#~ msgid "Command"
+#~ msgstr "Gorchymyn"
+
+#~ msgid "What's this?"
+#~ msgstr "Beth yw hwn?"
+
+#~ msgid "Username"
+#~ msgstr "Enw defnyddiwr"
+
+#~ msgid "Group name"
+#~ msgstr "Enw'r grwp:"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Nid yw'r cyfrineiriau yn cydweddu"
+
+#~ msgid "Optional"
+#~ msgstr "Dewisol"
+
+#~ msgid "Date"
+#~ msgstr "Dyddiad"
+
+#~ msgid "Permissions"
+#~ msgstr "Caniatadau"
+
+#~ msgid "Owner"
+#~ msgstr "Perchennog"
+
+#~ msgid "Are you sure?"
+#~ msgstr "Ydych Yn Sicr?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Trosglwyddo"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Cyffredinol"
+
+#~ msgid "&Other"
+#~ msgstr "&Arall"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Am&lygu"
+
+#~ msgid "E&dit..."
+#~ msgstr "G&olygu ..."
+
+#~ msgid "Re&move"
+#~ msgstr "G&waredu"
+
+#~ msgid "E&nabled"
+#~ msgstr "A&lluogir"
+
+#~ msgid "Patterns"
+#~ msgstr "Patrymau"
+
+#~ msgid "&Low"
+#~ msgstr "I&sel"
+
+#~ msgid "Value:"
+#~ msgstr "Gwerth:"
+
+#~ msgid "&Skip"
+#~ msgstr "&Hepgor"
+
+#~ msgid "&High"
+#~ msgstr "&Uchel"
+
+#~ msgid "Clear Filter"
+#~ msgstr "Gwagio hidlen"
+
+#~ msgid "Filter"
+#~ msgstr "Hidlo"
+
+#~ msgid "Transfer:"
+#~ msgstr "Trosglwyddo :"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Modd &All-lein"
+
+#~ msgid "Cache"
+#~ msgstr "Celc"
+
+#~ msgid "Boo&kmarks"
+#~ msgstr "Tu&dnodau"
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/kftpgrabber.po b/translations/da/messages/kftpgrabber.po
new file mode 100644
index 0000000..275b91f
--- /dev/null
+++ b/translations/da/messages/kftpgrabber.po
@@ -0,0 +1,3620 @@
+# Danish translation of kftpgrabber
+#
+# Erik Kjær Pedersen <erik@binghamton.edu>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-12-11 08:42-0500\n"
+"Last-Translator: Erik Kjær Pedersen <erik@binghamton.edu>\n"
+"Language-Team: Danish <dansk@klid.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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "indeholder"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "indeholder ikke"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "er lig med"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "er ikke lig med"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "matcher regulært udtryk"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "matcher ikke regulært udtryk"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "er"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "er ikke"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Mappe"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "er større end"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "er mindre end"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "byte"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Vælg venligst en handling."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Prioritet:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Hent"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Overfør"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Ukendt mærke ved tolkning af kommandoer for eget sted."
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Forespurgt handling er mislykket. Svaret fra serveren er:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Håndteringsmodulet <b>%1</b> kan ikke findes for at tolke svar.</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Filnavn"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Indgangstype"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Størrelse"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr ",Æ&ndr sted"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Spring over når det sættes i kø"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Farvelæg i listevisning"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Skjul fra listevisning"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Mål for små bogstaver"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Unavngiven regel"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Import fra gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPgrabber import"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Import fra NcFTP"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla 3-import"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Alle overførsler i køen er færdige."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Fil eksisterer"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPgrabber - En FTP-klient for KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "En valgfri url at forbinde til"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPgrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Hovedudvikler"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Udvikler"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH-kode"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc-kode"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Skærmmeddelelseskode KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Grafisk kontrol for trafikgraf"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Design af ikoner"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Test og fejlsøgning"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Mappetolkningskode"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Søjlehåndteringskode i listevisning"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Overførsel af følgende filer er færdig:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Forbindelse til serveren er mislykket."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Indlogning på serveren er mislykket"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Kildefilen kan ikke findes."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Tilladelse nægtet."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Kan ikke åbne fil til skrivning."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Overførsel mislykkedes af en eller anden grund."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Overførsel af følgende filer <b>er afbrudt</b> eftersom der ikke er "
+"tilstrækkeligt med ledig plads på '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Kan ikke oprette en SSH-forbindelse (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Logger på..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Forbundet til serveren, forsøger at logge på..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Indlogning mislykkedes."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Interaktiv godkendelseskontrol via tastatur lykkedes."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Godkendelseskontrol med åben nøgle lykkedes."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Kan ikke initiere SFTP-kanal."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Kan ikke initiere SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Forbundet."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Forbinder..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Forbinder til %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Afbrudt."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Bruger cachet mappelistning."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Henter mappelistning..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Overfører..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Henter filen '%1'..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Overfører filen '%1'..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Fjerner..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Omdøber..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Ændrer tilstand..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Forbindelse er mislykket."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr "SSL-forhandling lykkedes. Forbindelse er sikret med %1-bit cipher %2."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL-forhandling mislykkedes. Indlogning afbrudt."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL-forhandlingsforespørgsler mislykkedes. Indlogning afbrudt."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL-forhandling mislykkedes. Forbindelse afbrudt."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Forbundet til serveren, venter på velkomstmeddelelse..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Mislykkedes at forbinde (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Inkompatibel adressefamilie for PORT, men EPRT understøttes ikke. Afbryder."
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Opretter data-forbindelse med %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Kan ikke oprette en lyttesokkel."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Venter på data-forbindelse på port %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Data-forbindelse oprettet."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Datakanal sikret med %1-bit SSL."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr "SSL-forhandling for datakanalen mislykkedes. Afbryder overførsel."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Overførsel færdig."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Opretter mappe..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Ingen server understøtter SSCN/CPSV, men der blev bedt om en "
+"SSL-dataforbindelse. Afbryder overførsel."
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Overfører filen '%1'..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Sender hold-i-live..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Afbrudt."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Tidsgrænse for forbindelse er udløbet."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Tomgang."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Søgning færdig."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Starter rekursiv mappesøgning..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Venter %1 sekunder inden genforbindelse..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Venter..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Forsøger at forbinde igen (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Forsøger at forbinde igen..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Genforbindelse afbrudt."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Der er handlinger for filen (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Størrelse/Tidsstempel"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Samme"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Ældre"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Nyere"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Mindre"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Større"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Skip"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Overskriv"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Genoptag"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Omdøb"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Spørg"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Log (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Lokal session"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Det lykkedes at oprette forbindelse til %1."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Sørg for din private nøgle til afkodning af kodeord."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Session"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Mindst en session skal forblive åben på hver side."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Afslut alle overførsler inden sessionen lukkes."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Denne session er for øjeblikket forbundet. Er du sikker på at du vil afbryde?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Luk session"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Hurtig&forbind..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Ny session"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Venstre side"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Højre side"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "O&verførselstilstand (Automatisk)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binær"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "O&verførselstilstand (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "O&verførselstilstand (Binær)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Vælg..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Intet navn"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Overførsel"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Der er ingen mislykkede overførsler."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr " Gensta&rt overførsel"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Tilføj til kø"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Tilføj alle til kø"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Fjern"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Fjern alle"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Er du sikker på at du vil fjerne denne mislykkede overførsel?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Er du sikker på at du vil fjerne ALLE mislykkede overførsler?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form 1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nyt mønster"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Filnavnemønster:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Farve:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Hurtigforbind"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Ryd liste med senest besøgte steder?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "et værtsnavn"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "en gyldig port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "dit brugernavn"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "dit kodeord"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " og"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Indtast "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Sørg for dit X509-certifikat for afkodning af kodeord."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Steder nær dig"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Ingen steder publicerede."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Mønster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Farve"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Tilføj mønster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Aktiveret"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Fremhævning"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Endnu ikke implementeret.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Spring-over liste"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII-udvidelser"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Generelt"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Overførsler"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Vis"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Handlinger"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtre"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Verificering af tjeksum"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Tjeksum"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verifikation færdig."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Kan ikke åbne tjeksumfil, eller også har filen et fejlagtigt format."
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filter &aktiveret"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Ingen filtre."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Op"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Ned"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Omdøb..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Ny"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Omdøbningsregel"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Omdøb på regel '%1' til:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Betingelser"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Passer med &alle følgende"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Passer med en &vilkårlig af følgende"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Søg og erstat"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Brug af båndbredde"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Flere"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Færre"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Ryd"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "hænger"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "kører"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Venter på forbindelse..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Navn"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Kilde"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Mål"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Fremgang"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Hastighed"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "Ankomst"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Du har ingen filer i køen."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Ned"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "Op"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Tråde"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Start overførsel"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Afbryd overførsel"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "&Fjern alle"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Flyt &op"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Flyt &ned"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Flyt længst &op"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Flyt længst &ned"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Æ&ndr overførselsinformation"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Indlæs kø fra fil"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Gem kø til fil"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "S&tart"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pause"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Tilføj overførsel..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Søg og erstat..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Vis &filter"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Sted"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Er du sikker på at du vil fjerne filer i køen?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Er du sikker på at du vil fjerne ALLE filer i køen?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"At indlæse en ny kø overskriver den eksisterende. Er du sikker på at du vil "
+"fortsætte?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Indlæs kø"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Stedsession [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Tråd %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "tomgang"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "afbrudt"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "kobler på"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "overfører"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Status"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Der er ingen tråde som for øjeblikket kører."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Ingen bogmærker."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Ny..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Omdøb"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Opret delkategori..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplikér"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr "Angiv brugernavn og kodeord for at forbinde til dette sted."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Sted:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Kategorinavn"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Omdøb kategori:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nyt kategorinavn"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Ny kategori:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Ny server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Ny server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Er du sikker på at du vil fjerne denne kategori?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Er du sikker på at du vil fjerne serveren?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Kan ikke indlæse valgt importplugin."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Den valgte fil findes ikke eller er ikke læsbar."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Import af bogmærker er færdig."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "R&edigér..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL- og TLS-Indstillinger"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importér..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Eksportér..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP-bogmærkeeditor"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt> Du skal blot eksportere dine KFTPgrabber bogmærker. De kan indeholde "
+"kodeord eller følsomme X509-certifikater. At eksportere dine bogmærken kan "
+"kompromittere deres sikkerhed."
+"<br>"
+"<br>Er du sikker?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Eksportér bogmærker"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Afbryd"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Vi&s trævisning"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Egenskaber"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Makulér"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "&Filterindstillinger"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Skip altid &denne fil ved tilføjelse til kø"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Lad denne fil få &højeste prioritet"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Lad denne fil få &laveste prioritet"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Overførsel"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Sæt overførsel i &kø"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Opret mappe..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Å&bn fil"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verificér..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Flere handlinger"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "&Manuel kommandoindtastning..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Eksportér mappelistning..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Vis s&kjulte filer && mapper"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Åbn nuværende mappe i &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Sammenlign &markerede punkter"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Sammenlign &mapper"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Send &ubehandlet kommando"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "Æ&ndr sted"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Hurtigforbindelse..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Forbind til"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Afbryd"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Ændr fjernt &tegnsæt"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Vil du droppe nuværende forbindelse?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Er du sikker på at du vil MAKULÉRE filen?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Makulér fil"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Vil du virkelig slette dette punkt?\n"
+"Vil du virkelig slette alle %n punkter?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Slet filer"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Skip '%1'"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Prioritet '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Opret mappe"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Mappenavn:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Send ubehandlet kommando"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Kommando:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Eksportér mappelistning"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Identiske filer på begge sider er blevet skjult. Kun <b>uens filer</b> "
+"er nu synlige."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Generelt"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Fjernmappe"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Ukendt"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Type:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Sted:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Størrelse:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Oprettet:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Tilladelser"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Adgangstilladelser"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klasse"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Vis\n"
+"indgange"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Læs"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Skriv\n"
+"indgange"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Skriv"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Få tilgang til"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Exec"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Speciel"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Bruger"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Gruppe"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Andre"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Sæt UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Sæt GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Klæbrig"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Anvend ændringer for alle undermapper og deres indhold"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Rodmappe"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Søgesti: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Dette er en SSH-krypteret forbindelse. Ingen certifikatinformation er for "
+"øjeblikket tilgængelig."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Filterindstillinger"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Opret mappe"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Filtrér symbolske link"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Versalfølsom"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPgrabber</b> logning initieret.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Kan ikke åbne fil til skrivning."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Kan ikke finde XML-beskrivelsesfilen for grafisk grænseflade %1. Kontrollér "
+"at du har installeret programmet rigtigt. Hvis du har nogle spørgsmål, stil dem "
+"på %2."
+"<br>"
+"<br><b>Advarsel:</b> Nuværende grafisk grænseflade vil være ufuldstændigt.</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Att lukke hovedvinduet gør at KFTPgrabber fortsætter med at køre i "
+"statusfeltet. Brug <b> Afslut</b> i <b>KFTPgrabbers</b> "
+"menu for at afslutte programmet.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Dokker i statusfeltet"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Der er for øjeblikket en overførsel i gang.\n"
+"Der er for øjeblikket %n overførsler i gang."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Er du sikker på at du vil afslutte?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP-steder nær mig"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Steder i Kwallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Redigér bogmærker..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Henter: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Overfører: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Kø"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Mislykkede overførsler"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Steder nær mig"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Tråde"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Trafik"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopi af"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Dette bogmærke er krypteret. Angiv en nøgle for afkodning."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Afkodning af bogmærkefil er mislykket med den angivne nøgle. Vil du <b>"
+"overskrive</b> bogmærkerne med en tom fil?"
+"<br>"
+"<br><font color=\"red\"><b>Advarsel:</b> Hvis du overskriver, går alle "
+"nuværende bogmærker tabt!</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Afkodning mislykkedes"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "Overskriv b&ogmærkerne"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Angiv nøgle for kryptering af bogmærkefilen."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Ingen tjenester publicerede>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD ikke tilgængelig>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Ingen steder i Kwallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Erik Kjær Pedersen"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "erik@binghamton.edu"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Vis"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Fil&browser"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Vis s&kjulte filer og mapper"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Vis &mappetræ"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "Vis fil&størrelser i byte (skift til \"menneskeligt læsbart\" format)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Vis &ejer og gruppe for hver fil"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Vis mappe&størrelse"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "Andre &grænsefladeelementer"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Vis venstre sidebjælke"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Kø søg og erstat"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Ved at bruge denne dialog kan du lave store erstatninger af kilde- og "
+"målsøgestier for overførsler i kø. <b>Ændringer kan ikke fortrydes.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Søg efter hvad"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destination:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Kilde:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Søg kun efter overførsler på en specifik server"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Serverinformation"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Servernavn:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Vært:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Kodeord:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Erstat med"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Importguide for bogmærker"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Skridt 1: <b>Vælg plugin for import</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Billede"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Vælg passende plugin for import i listen nedenfor. Hvert plugin kan importere "
+"fra et specifikt format."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Tilgængelige plugin for import:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Skridt 2: <b>Vælg bogmærkefil at importere</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Vælg bogmærkefilen som du vil importere dine bogmærker fra. En standardsøgesti "
+"er allerede bestemt af pluginnet for import."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Søgesti til bogmærker</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Skridt 3: <b>Importerer bogmærker...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Vent mens bogmærkerne importeres."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Importfremgang</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Udseende"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Skrifttype og farver"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Skrifttype:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Klientkommandofarve:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Serversvarfarve:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Flerlinjers svarfarve:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Farve for fejlmeddelelser:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Statusmeddelelsesfarve:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Uddata"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&Filuddata"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Gem log til fil"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Uddata-fil:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Kildeserverinformation"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Målserverinformation"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b> Kilde:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Mål:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Overførselstype:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "For&bindelse"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "Aktiv forbindelses IP-adresse"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Tving PORT/EPRT til at br&uge indstillet IP-adresse"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/værtsnavn:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "&Ignorér ekstern IP-adresse for forbindelser i lokalt netværk"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Aktiv forbindelses portinterval"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Brug &kun porte i det angivna portinterval"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Minimale port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Maksimale port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Tidsudløb"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Kontrolforbindelseens tidsgrænse (i sekunder):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Tidsgrænse for dataoverførsel (i sekunder):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Hastighedsgrænse"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Henter: (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Overfører: (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Disk&plads"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Kontrol af ledigt diskplads"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Stop overførsel hvis der &ikke er tilstrækkeligt med ledig plads"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Interval (sek):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimalt ledigt plads (MB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "&Tråde"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Antal tråde pr session:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Brug primær forbindelse til overførsler"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Diverse"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Forsøg automatisk mislykkede overførsler igen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Maksimalt antal forsøg inden markering som mislykkedes:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Andet"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "&Kø filer (i stedet for overfør) ved \"træk og slip\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Spring over tomme &mapper ved tilføjelse til kø"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "&Bekræft afbrydelser før der afbrydes"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "FPT-stedegenskaber"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Værtsnavn:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokol:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP via TLS/SSL (eksplicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP via TLS/SSL (implicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP via SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Stedetikette:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Fjernmappe:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Lokal mappe:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonym indlogning"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Avanceret"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "&Deaktivér brug af udvidet passiv tilstand"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Deaktivér brug af passiv tilstand"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Brug stedets IP-adresse for forbindelser passiv tilstand"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+"Deaktivér \"tving aktiv tilstand til at bruge IP-adresse\" for dette sted"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Brug STAT til mappelistninger"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Flere overførselstråde"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Brug ikke flere tråde for dette sted"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Serverkodning"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Indkodning:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Forsøg igen og &hold-i-live"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Forsøg at forbinde i&gen ved mislykkede."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Prøv igen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Antal forsøg (0 = ubegrænset)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Forsinkelse inden forsøg igen:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Brug hold-i-live pakke til at holde forbindelsen åben"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Hold-i-live"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Hold-i-live frekvens (sekunder):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII-fil&endelser"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Tilføj endelse"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Endelse:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Udvidelse"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Nylige forbindelser"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Vælg forbindelse:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Indtast hele url'en i dette felt"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Indtast værtnavn for FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anon&ym indlogning"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Tjek anonym indlogning"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Indtast kontoens brugernavn"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Indtast kontoens kodeord"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Tilføj &bogmærke"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avanceret"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Opsætning af data-forbindelse"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Tilstand:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Kryptér altid datakanalen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Kryptér kun for mappelistninger"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Kryptér ikke datakanalen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509-certifikat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Brug følgende SSL-certifikat ved forbindelse"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Sti:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-mail-&adresse:"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "Br&ug e-mail-adresse fra kontrolcenter"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-mail:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Opstart og afslut"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Bekræft &afslutning af programmet hvis der er aktive overførsler"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Start programmet &minimeret i statusfeltet"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Vis *opstartskærm ved start"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Vis ikon i s&tatusfeltet"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Afslut normalt når &X-knappen klikkes"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Standard for steder"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "&Kryptér bogmærkefil"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Vis steder fra Kwallet blandt &bogmærker"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Underretningstilvalg"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Balloner"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Vis skærm&meddelelse når overførslen er færdig"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Vis kun når &køen er tom efter en overførsel"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Vis skærmmeddelelse når forsøg på at forbinde i&gen lykkes"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Fil:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "ingen"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Filliste"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Ubehandlet"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "O.k."
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Ikke fundet"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Mislykkedes"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Hovedvinduets størrelse"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Hovedvinduets position på skærmen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Standardantal forsøg for nye steder."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Standardtidsgrænse for nye steder."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Skal en skærmmeddelelse vises når en handling er færdig."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Skal en skærmmeddelelse vises når alle overførsler i en kø er færdige."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Skal en skærmmeddelelse vises når en forbindelse til serveren er oprettet med "
+"godt resultat efter at have forsøgt igen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Skal brugeren bekræfte afslutning hvis overførsler er i gang."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Bogmærkefilens krypteringsstatus."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Lokal standardmappe."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Skal programmet afsluttes når brugeren klikker på X-knappen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Skal programmet startes minimeret."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Skal startskærmen vises når programmet startes."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Skal ikonen i statusfeltet vises."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Skal steder fra Kwallet vises blandt bogmærkerne."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Skal dialogen \"Bekræft afbrydelse\" vises hver gang en afbrydelse begæres."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Tegnsæt for standardsted."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Nylige steder med adgang via hurtigforbindelse."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"En liste med filmønstre hvor ASCII-tilstand skal bruges ved overførsel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Skal tomme mapper springes over."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Skrifttype som skal bruges for logkontrollen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Farven på kommandoen sendt til serveren."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Farve for svarene fra serveren."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Farve for flerlinjerssvar fra serveren."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Farve for fejlmeddelelser."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Farve for statusmeddelelser."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Skal loggen også skrives til en fil."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Filen som loggen skal skrives til."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Skal en port fra et angivet portinterval vælges for aktive overførsler."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Portintervallets begyndelse."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Portintervallets slutning."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Skal en IP-adresse sættes ud af kraft når aktive overførsler udføres."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "IP-adressen at sende når PORT-kommandoen sættes ud af kraft."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Skal ekstern IP-adresse ignoreres for forbindelser i lokalt netværk."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Skal overførslerne sættes i kø i stedet for at startes når træk og slip bruges."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Skal KFTPgrabber kontrollere ledig plads og afbryde overførslen når der ikke er "
+"tilstrækkeligt med ledig plads.\t"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Interval for diskkontrol."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Minimalt ledigt plads (i Mb) som skal være tilgængeligt."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Brug KDE's generelle e-mail-adresse for anonyme kodeord."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "E-mail-adressen som skal bruges til anonyme kodeord."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Antal tråde at bruge ved overførsel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Skal den primære forbindelse bruges til overførsler."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tidsgrænse (i sekunder) for kontrolforbindelsen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tidsgrænse (i sekunder) for dataoverførsler."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Global hastighedsgrænse for download (Kb/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Global hastighedsgrænse for overførsel (Kb/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Skal mislykkede overførsler automatisk forsøges igen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr "Maksimalt antal forsøg inden overførsel markeres som mislykket."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Skal mappetræet vises som standard."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Skal skjulte filer vises."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Skal filstørrelsen vises i byte i stedet for i \"menneskeligt læsbar\" form."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Skal ejer og gruppe vises for hvert fil."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Vis mappestørrelse."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Vis venstre sidebjælke."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Hovedmenu"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Bogmærke-værktøjslinje"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Intet brugernavn angivet for '%1'."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Fejl ved forbindelse"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "Visningsindstillinger"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Hurtigforbind"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Kan ikke finde et passende program til at åbne filen."
+
+#~ msgid "Webpage design"
+#~ msgstr "Design af netside"
+
+#~ msgid "Command"
+#~ msgstr "Kommando"
+
+#~ msgid "What's this?"
+#~ msgstr "Hvad er dette?"
+
+#~ msgid "Server Management"
+#~ msgstr "Server-håndtering"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Henter: %1 Mbyte Overførsel: %2 Mbyte<br>Kredit: %3 Mbyte Forhold: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Dialog for stedkommando"
+
+#~ msgid "Username"
+#~ msgstr "Brugernavn"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Indtast et brugernavn eller tryk på Annullér"
+
+#~ msgid "Group name"
+#~ msgstr "Gruppenavn"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Indtast en gruppe eller tryk på Annullér"
+
+#~ msgid "Description name"
+#~ msgstr "Beskrivelsesnavn"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Indtast en beskrivelse eller tryk på annullér"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Kodeord er ikke ens"
+
+#~ msgid "Optional"
+#~ msgstr "Frivillig"
+
+#~ msgid "Password retype:"
+#~ msgstr "Indtast kodeord igen:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Send &ubehandlet kommando..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Vis din tomgangstid"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Indstil din tomgangstid (kun pr session)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Indstil din tomgangstid (kun pr session)<br>Dette indstiller din tomgangstid (tiden du kan være forbundet<br>uden at gøre noget). Maksimal tomgangstid er 7200 sekunder.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Dette ændrer dit kodeord"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Dette ændrer dit kodeord.<br> Kodeord kan kun være 8 tegn lange."
+
+#~ msgid "Display the group info"
+#~ msgstr "Vis gruppeinformationen"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Vis gruppeinformationen<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Vis nuværende aliasser"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Vis nuværende søgestier til arbejdsmapper"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Vis nuværende version af glftpd"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Vis nuværende version af glftpd<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Viser brugere som for øjeblikket er online"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Viser brugere som for øjeblikket er online<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Viser velkomstskærmen"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Viser velkomstskærmen<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Viser nuværende tid på stedet"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Viser nuværende tid på stedet<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Vis udgaver som for nyligen blev fjernet"
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Vis udgaver som for nyligen blev fjernet<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Slet en bruger, kan tilføjes igen med site READD"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Slet en bruger, kan tilføjes igen med site READD<br><br><i>Eksempel:</i> site deluser Archimedes<br><br>Dette aktiverer flaget DELETED (6) for brugeren 'Archimedes'.<br>For at fjerne brugeren helt og holdent skal du skrive 'site purge'<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Ændr brugerens kodeord"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Ændr brugerens kodeord<br><i>Eksempel:</i> site chpass Archimedes nyt-kodeord<br>Dette skulle ændre kodeordet til 'nyt-kodeord' for<br>brugeren 'Archimedes'.<br><br>Se \"site passwd\" for mere information hvis du får fejlen at kodeordet ikke<br>er sikkert nok.<br><br>* angiver et hvilket som helst kodeord, <i>Eksempel:</i> site chpass arch *<br>Dette tillader at arch logger på med et hvilket som helst kodeord<br><br>@ angiver hvilket som helst e-mail-lignende kodeord, <i>Eksempel:</i> site chpass arch @<br>Dette tillader at arch logger på med a@b.com, men ikke med ab.com<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Ændr brugerens status som gruppeadministrator for en given gruppe"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Ændr brugerens status som gruppeadministrator for en given gruppe<br><b>Bemærk:</b> Når en bruger bliver gruppeadministrator, får han<br>automatisk flag 2 tilføjet. Når en brugere holder op med at være<br>gruppadministrator for en af sine grupper, tages flaget<br>gadmin automatisk bort.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Vis en brugers flag"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Vis en brugers flag<br><br><i>Eksempel:</i> site flags<br><br> Dette viser dine egne flag<br><br><i>Eksempel:</i> site flags Archimedes<br><br>Dette viser flagene for brugeren Archimedes.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Smid en bruger ud fra stedet"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Smid en bruger ud fra stedet<br><br><i>Eksempel:</i> site kick Archimedes<br><br>Dette skulle dræbe alle forbindelseer for brugeren 'Archimedes'<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Fjern slettede brugere permanent, site READD virker IKKE for permanent fjernede brugere."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Fjern slettede brugere permanent, site READD virker IKKE for permanent fjernede brugere.<br><br><i>Eksempel:</i> site purge<br>Dette FJERNER ALLE brugere som har flaget DELETED sat.<br><br><i>Eksempel:</i> site purge frank<br>Dette fjerner kun frank og lader resten af de slettede brugere være.<br><br>Hvis du er en gruppeadministrator, kan du kun fjerne brugere i din gruppe (dvs.<br>hvis du er blevet givet adgang til kommandoen i indstillingsfilen).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Tilføj bruger igen"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Tilføj brugere igen<br><br><i>Eksempel:</i> site readd<br><br>Dette viser en liste med brugere som kan tilføjes igen.<br>(Du kan også opnå dette med \"site users deleted\"<br><br><i>Eksempel:</i> site readd Archimedes<br><br>Dette fjerner flaget DELETED for brugeren 'Archimedes'.<br><br><b>Bemærk:</b> Når en bruger tilføjes igen fra en gruppe, skal gruppen have tilgængelige pladser<br>tilbage, også selvom du er en stedoperator.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Viser en brugeres statistik for at hente og overføre"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Viser en brugers statistik for at hente og oveføre<br><br>Kan defineres i '/ftp-data/text/user.stats'<br><br>Hvis du har flere sektioner viser dette statistik fra<br>alla sektioner. (Men du skal kopiere filen til SECTIONuser.stats.<br>Eksempel: Hvis du har et afsnit som hedder SPIL, så kigger glftpd<br>efter filerne user.stats og SPILuser.stats i /ftp-data/text dir.<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Lister brugere / Viser detaljeret information om en bruger"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Lister brugere / Viser detaljeret information om en bruger<br><br><i>Eksempel:</i> site user<br><br>Dette viser en liste med alle brugere som for øjeblikket er på stedet.<br><br><i>Eksempel:</i> site user Archimedes<br><br>Dette viser detaljeret information om brugeren 'Archimedes'.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Viser tilgængelige grupper"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Viser detaljeret information om en gruppe"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Viser detaljeret information om en gruppe<br><br><i>Eksempel:</i> site ginfo ftp<br><br>Dette viser detaljeret information om gruppen 'ftp'<br>Hvis en bruger slettes, erstattes hans mærkelinje med \"***DELETED***\".<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Tilføj ny gruppe"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Tilføj en ny gruppe<br><br><i>Eksempel:</i> site grpadd gruppe ny_gruppe<br><br>Dette skulle tilføje gruppen 'gruppe' med beskrivelseen 'ny_gruppe'.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Slet en gruppe"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Slet en gruppe<br><br><i>Eksempel:</i> site grpdel gruppe<br><br>Dette skulle fjerne gruppen 'gruppe'<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Viser nuværende grupper eller forlader/går med i en gruppe"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Viser nuværende grupper eller forlader/går med i en gruppe<br>For at gå med i en gruppe sendes blot gruppenavnet som parameter til<br>kommandoen. Du skal forlade alle grupper inden du kan gå med i en ny.<br>Kun brugere med flaget stedoperator aktiveret kan ændre private<br>grupper (se site CHGRP)<br><br><i>Eksempel:</i> site group<br><br>Dette viser grupperne som du indgår i.<br><br><i>Eksempel:</i> site group ftp<br><br>Med dette går du med i eller forlader gruppen 'ftp'.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Ændr beskrivelse for en gruppe"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Ændr beskrivelse for en gruppe<br><br><i>Eksempel:</i> site grpnfo ftp ny_beskrivelse<br><br>Dette ændrer nuværende beskrivelse for gruppen 'ftp' til<br>'ny_beskrivelse'.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Vis din nuværende statuslinje"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Vis hentede for hele tiden"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Vis hentede for hele tiden"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Vis hentere for hele tiden som tilhører gruppen"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Viser downloadere for hele tiden.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Vis uploadere for hele tiden"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Vis uploadere for hele tiden som tilhører gruppen"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Viser uploadere for hele tiden.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Vis dagens største upload"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Vis dagens største uploadere som tilhører gruppen"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis dagens største upload.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Vis dagens største download"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Vis dagens største download som tilhører gruppen"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis dagens største download.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Vis månedens største upload"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Vis månedens største upload som tilhører gruppen"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis månedens største upload.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Vis månedens største download"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Vis månedens største download som tilhører gruppen"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis månedens største download.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Vis største antal ødelagte for hele tiden"
+
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Vis største antal ødelagte for hele tiden"
+
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Vis største antal ødelagte for hele tiden som hør til gruppen"
+
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis største antal ødelagte for hele tiden.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Vis ugens største uploadere"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Vis ugens største uploadere som tilhører gruppen"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis ugens største uploadere.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Vis ugens største downloadere"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Vis ugens største downloadere som tilhører gruppen"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Vis ugens største downloadere.<br><group> er også valgfrit. At angive det viser brugere som<br>hører til gruppen, men brugeren som gør det skal have særlige<br>adgangrettigheder i glftpd.conf for at gøre det. Dette styres af indstillingen<br>-grpstats."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Vis servertrafik"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Vis servertrafik<br>Viser totalt antal upload og download af alle eksisterende brugere i alle afsnit"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Vis gruppe-upload for hele tiden"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Vis gruppe-upload for hele tiden<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Vis gruppe-upload for måneden"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Vis gruppe-upload for måneden<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Vis gruppe-download for måneden"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Vis gruppe-download for måneden<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Vis største gruppe-upload for ugen"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Vis største gruppe-upload for ugen<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Vis største gruppe-download for ugen"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Vis største gruppe-download for ugen<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Vis gruppe-download for hele tiden"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Vis gruppe-download for hele tiden<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Indlæse brugerens brugerfil i din proces' hukommelse, og bliv til den bruger i alt væsentligt."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Indlæse brugerens brugerfil i din proces' hukommelse, så at du i alt væsentligt<br>bliver den bruger (selv om visse ting, såsom hjemmemappe eller værdien af<br>'site who' ikke ændres). Kræver rettigheden -emulate i indstillingsfilen.<br>Dette oprettetes for særlige scripter, så at de kan opføre sig som en vis brugere<br>uden at behøve at kende vedkommendes kodeord og logge på som brugeren. De<br>fleste stedoperatorer har ingen brug for dette.<br><br>Bemærk: Dette er ikke SAND emulering, du bør ikke bruge det for at gøre alvorlige<br>ting. Visse ting virker ikke, og visse virker forkert. Den eneste<br>måde at opnå sand emulering, er at logge på som brugeren.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Vis hjælpeskærm"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Vis hjælpeskærm<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Vis mislykkede indlogninger"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Vis mislykkede indlogninger<br><br>Dette viser '/glftpd/ftp-data/logs/login.log'<br>Se information om \"site syslog\" for syntaksen.<br>"
+
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Vis nylige ødelagte udgaver"
+
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Vis nylige ødelagte udgaver<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Kontrollér hvornår en bruger senest var forbundet"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Tjek hvornår en bruger sidst var online<br><br><i>Eksempel:</i> site seen Archimedes<br><br>Dette viser sidste gang da Archimedes var logget på.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Viser brugerfilen i ubehandlet format"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Viser brugerfilen i ubehandlet format<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Viser detaljeret information om brugere online"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Viser detaljeret information om brugere online<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Send bogmærker til"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Ingen kontakter tilgængelige>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Deaktiveret i denne udgave af KDE>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt> Du skal blot sende dine KFTPgrabber bogmærker til <b>%1</b>. De kan indeholde kodeord eller følsomme X509-certifikater. At sende dine bogmærken kan kompromittere deres sikkerhed.<br><br>Er du sikker?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Send bogmærker"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Denne server er en distribueret FTP-dæmon"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Er du sikker på at du vil slette filerne?"
+
+#~ msgid "Date"
+#~ msgstr "Dato"
+
+#~ msgid "Permissions"
+#~ msgstr "Tilladelser"
+
+#~ msgid "Owner"
+#~ msgstr "Ejer"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Kan ikke åbne mappen '%1'."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Mappen indeholder 1 fil.\n"
+#~ "Mappen indeholder %n filer."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "At vise alle kan tage en vis tid."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Er du sikker?"
+
+#~ msgid "Alt+E"
+#~ msgstr "Alt+E"
+
+#~ msgid "GeneralSettings"
+#~ msgstr "GenerelOpsætning"
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Tilføj nyt mønster"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Er du sikker på at du vil fjerne dette mønster?"
+
+#~ msgid "&Other"
+#~ msgstr "&Andet"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Skift navn på filer til små bogstaver &ved download"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "&Fremhævning"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "&Tilføj mønster..."
+
+#~ msgid "E&dit..."
+#~ msgstr "R&edigér..."
+
+#~ msgid "Re&move"
+#~ msgstr "&Fjern"
+
+#~ msgid "E&nabled"
+#~ msgstr "&Aktiveret"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Prioritets&liste"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Prioritetsmønster:"
+
+#~ msgid "Patterns"
+#~ msgstr "Mønstre"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "&Tilføj mønster"
+
+#~ msgid "&Low"
+#~ msgstr "&Lav"
+
+#~ msgid "Value:"
+#~ msgstr "Værdi:"
+
+#~ msgid "&Skip"
+#~ msgstr "&Skip"
+
+#~ msgid "&High"
+#~ msgstr "&Høj"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Indstilling af prioritetsliste"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "A&ktivér prioritetsliste"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "&Spring over tomme filer"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "&Brug prioritetsliste for mapper"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Sæt ikke filer i &kø overspringningsliste"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Kø mapper før filer"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "En liste med filmønstre som skal markeres ved browsing."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Skal filerne i filterlisten markeres."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Skal filerne i overspringningslisten springes over."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Skal tomme filer springes over."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Gælder overspringningslisten også for mapper."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Sæt ikke filer i kø fra overspringningslisten."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Sæt mapper i kø før filer."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Skal alle downloadede filnavne forvandles til små bogstaver."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "redigér-makulér"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "&Indstil filter..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Ryd filter"
+
+#~ msgid "Filter"
+#~ msgstr "Filter"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Indtast filter:"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL-indstillinger"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Overførselstilstand:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - privat (privat og med integritet)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - konfidentielt (privat men uden integritet)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - sikkert (integritet uden at være privat)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - i klartekst (ikke SSL)"
+
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Data-forbindelse mislykkedes (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Overførsel:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Ned %1/s Op %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "SFTP læser mappelistning..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "SFTP mappe ændret til '%1'"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Starter med at downloade filen '%1'"
+
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr ""
+#~ "Overførte 1 byte.\n"
+#~ "Overførte %n byte."
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Starter med '%1' fil-upload"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "FXP-overførsel mislykkedes."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Indstilling af beskyddet tilstand mislykkedes. Går tilbage til ikke-krypteret forbindelse."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Ukendt vært '%1'."
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Kan ikke oprette implicit SSL-forbindelse."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Oprettede implicit SSL-forbindelse."
+
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "Passiv tilstand er mislykket to gange. Deaktiverer brug af PASV."
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Mappelistning færdig."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Kan ikke forbinde til server."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Afbrudt fra serveren."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "Uforenelige SSL-tilstande på kilden og destinationens servere."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "Der opstod et problem med at oprette forbindelsen for data."
+
+#~ msgid "Error reading file."
+#~ msgstr "Fejl ved læsning af fil"
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "Kan ikke forbinde til server."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Mappe er ikke i cache."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Kan ikke åbne mappe."
+
+#~ msgid "View &Local"
+#~ msgstr "Vis &lokal"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "&Offline tilstand"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "Denne url findes ikke i cachen."
+
+#~ msgid "Cache"
+#~ msgstr "Cache"
+
+#~ msgid "Cache support"
+#~ msgstr "Cacheunderstøttelse"
+
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Aktivér cache for &mappelister"
+
+#~ msgid "Alt+D"
+#~ msgstr "Alt+D"
+
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr "Tidsgrænse for cache (i sekunder):"
+
+#~ msgid "Should the cache be used when browsing the sites."
+#~ msgstr "Skal cachen bruges når stederne besøges."
+
+#~ msgid "The time after cached entries expire."
+#~ msgstr "Tiden efter hvilken cachede indgange udløber."
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/kftpgrabber.po b/translations/de/messages/kftpgrabber.po
new file mode 100644
index 0000000..7fa07db
--- /dev/null
+++ b/translations/de/messages/kftpgrabber.po
@@ -0,0 +1,2994 @@
+# translation of kftpgrabber.po to Deutsch
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Christoph Thielecke <crissi99@gmx.de>, 2004.
+# Thomas Reitelbach <tr@erdfunkstelle.de>, 2006.
+# Ulrich Knauss <knausser@gmx.de>, 2006.
+# Jannick Kuhr <jannick.kuhr@kdemail.net>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-04-18 15:59+0200\n"
+"Last-Translator: Jannick Kuhr <jannick.kuhr@kdemail.net>\n"
+"Language-Team: Deutsch <kde-i18n-de@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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "enthält"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "enthält nicht"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "ist gleich"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "ist nicht gleich"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "entspricht regexp"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "entspricht nicht regexp"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "ist"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "ist nicht"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Ordner"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "ist größer als"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "ist kleiner als"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "Bytes"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Bitte wählen Sie eine Aktion."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Priorität:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Herunterladen"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Hochladen"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Unbekanntes Tag beim Verarbeiten benutzerdefinierter Seitenbefehle."
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Der angeforderte Vorgang ist fehlgeschlagen. Die Antwort des Server ist:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Der Handler mit dem Namen <b>%1</b> kann nicht für das Verarbeiten der "
+"Serverantwort gefunden werden.</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Dateiname"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Eintragstyp"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Größe"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Priorität ändern"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Beim Einstellen in die Warteschlange überspringen"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "In Listenansicht einfärben"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "In Listenansicht ausblenden"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Ziel in Kleinbuchstaben setzen"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Unbenannte Regel"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP-Import"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber-Import"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp-Import"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla3-Import"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Alle anstehenden Übertragungen sind abgeschlossen."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Datei existiert"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - ein FTP-Client für KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Eine optionale Adresse (URL) zum Verbinden"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Leitender Entwickler"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Entwickler"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH-Code"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc-Code"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon-Popupcode"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Graphische Anzeige des Datenverkehrs"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Symboldesign"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Tests und Fehlersuche"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Code zum Durchsuchen von Ordnern"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Code zur Spaltenhandhabung in der Listenansicht"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Übertragung der folgenden Dateien ist abgeschlossen:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Verbindung mit dem Server fehlgeschlagen."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Anmeldung am Server fehlgeschlagen."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Quelldatei konnte nicht gefunden werden."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Zugriff wurde verweigert."
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr "Die lokale Datei kann nicht zum Lesen oder Schreiben geöffnet werden."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Übertragung aus unbekanntem Grund fehlgeschlagen."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Übertragung der folgenden Dateien wurde <b>abgebrochen</b>"
+", da nicht genügend Platz auf '%1' ist:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Die SSH-Verbindung (%1) konnte nicht hergestellt werden."
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Anmeldevorgang läuft ..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Verbindung mit Server hergestellt, Anmelden wird versucht ..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Anmeldung fehlgeschlagen"
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Authentifizierung per Tastatureingabe erfolgreich."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Authentifizierung per öffentlichem Schlüssel erfolgreich."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "SFTP-Kanal kann nicht initialisiert werden."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "SFTP kann nicht initialisiert werden."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Verbunden."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Verbindungsaufbau ..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Verbindungsaufbau zu %1:%2 ..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Abgebrochen."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Ordnerinhalt aus dem Zwischenspeicher wird verwendet."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Ordnerinhalt wird aus dem Zwischenspeicher geladen ..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Übertragung läuft ..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Die Datei '%1' wird heruntergeladen ..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Die Datei '%1' wird hochgeladen ..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Entfernen läuft ..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Umbenennen läuft ..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Berechtigungen werden geändert ..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Verbindung fehlgeschlagen."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"SSL-Verhandlung erfolgreich. Verbindung ist mit %1-Bit %2-Verschlüsselung "
+"gesichert."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL-Verhandlung fehlgeschlagen. Anmeldung abgebrochen."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL-Verhandlungsanfrage fehlgeschlagen. Anmeldung abgebrochen."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL-Verhandlungsanfrage fehlgeschlagen. Verbindung abgebrochen."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Verbunden mit Server, auf Begrüßungsmeldung wird gewartet ..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Verbinden (%1) fehlgeschlagen"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Inkompatible Adressfamilie für PORT, aber EPRT nicht unterstützt. Vorgang wird "
+"abgebrochen."
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Datenverbindung mit %1:%2 wird hergestellt ..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Ein lauschender Socket konnte nicht hergestellt werden."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Auf Datenverbindung an Port %1 wird gewartet ..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Datenverbindung hergestellt."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Datenkanal ist durch %1-Bit SSL gesichert."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"SSL-Verhandlung für den Datenkanal ist fehlgeschlagen. Übertragung wird "
+"abgebrochen."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Übertragung abgeschlossen."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Ordner wird erstellt ..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"SSCN/CPSV wird von keinem Server unterstützt, aber es wurde eine "
+"SSL-Datenverbindung angefordert. Die Übertragung wird abgebrochen."
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Die Datei '%1' wird übertragen ..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Paket zum Aufrechterhalten der Verbindung wird übertragen ..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Nicht verbunden."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Zeitüberschreitung bei Verbindung."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Leerlauf."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Durchsuchen abgeschlossen."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Durchsuchen einschließlich der Unterordner wird gestartet ..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Vor Wiederaufnahme der Verbindung wird %1 Sekunden gewartet ..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Warten ..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Verbindungsversuch (%1/%2) wird wiederholt ..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Verbindungsversuch wird wiederholt ..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Wiederholung abgebrochen."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Aktionen falls Datei bereits existiert (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Größe/Zeitstempel"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Gleich"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Älter"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Neuer"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Kleiner"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Größer"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Überspringen"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Überschreiben"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Fortsetzen"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Umbenennen"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Fragen"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Protokoll (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Lokale Sitzung"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Protokoll"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Verbindung mit %1 wurde erfolgreich hergestellt."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+"Bitte geben Sie das Entschlüsselungspasswort Ihres privaten Schlüssels ein."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sitzung"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Wenigstens eine Sitzung muss auf jeder Seite geöffnet bleiben."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Bitte beenden Sie alle Übertragungen, bevor Sie die Sitzung schließen."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Diese Sitzung ist im Moment verbunden. Sind Sie sicher, dass getrennt werden "
+"soll?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Sitzung schließen"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Schnell&verbindung ..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Neue Sitzung"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Linke Seite"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Rechte Seite"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Über&tragungsmodus (Automatisch)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binär"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Automatisch"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Über&tragungsmodus (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Über&tragungsmodus (Binär)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Auswählen ..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Kein Name"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Übertragung"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Beschreibung"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Es gibt keine fehlgeschlagenen Übertragungen."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "Übertragung &neustarten"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "Zu Warteschlange &hinzufügen"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Alle zu Warteschlange hinzufügen"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "Ent&fernen"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Alle entfernen"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr ""
+"Sind Sie sicher, dass diese fehlgeschlagene Übertragung entfernt werden soll?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+"Sind Sie sicher, dass ALLE fehlgeschlagenen Übertragungen entfernt werden "
+"sollen?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Neues Muster"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Dateinamemuster:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Farbe:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Schnellverbindung"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Liste der zuletzt besuchten Seiten leeren?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "einen Hostnamen"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "einen gültigen Port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "Ihren Benutzername"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "Ihr Passwort"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr "und"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Bitte geben Sie ein: "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+"Bitte geben Sie das Entschlüsselungspasswort für das X509-Zertifikat ein."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Seiten in Ihrer Nähe"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Keine Seiten veröffentlicht."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Muster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Farbe"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Muster hinzufügen"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Aktiviert"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Hervorhebung"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Noch nicht implementiert</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Überspringen-Liste"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII-Erweiterungen"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Allgemein"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Übertragungen"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Anzeige"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Aktionen"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filter"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Prüfsummenprüfer"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Prüfsumme"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Prüfung abgeschlossen."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Die Prüfsummendatei kann nicht geöffnet werden oder die Datei hat ein falsches "
+"Format!"
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filter &aktiviert"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Keine Filter."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Nach oben"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Nach unten"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Umbenennen ..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Neu"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Regel umbenennen"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Regel '%1' umbenennen in:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Bedingungen"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Stimmt mit a&llen der folgenden überein"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Stimmt mit &einer der folgenden überein"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Suchen & Ersetzen"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Bandbreitennutzung"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Mehr"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Weniger"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Zurücksetzen"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "verzögert"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "läuft"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Auf Verbindung wird gewartet ..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Name"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Quelle"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Ziel"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Fortschritt"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Geschwindigkeit"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Sie haben keine Dateien in der Warteschlange."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr "Herunterladegeschwindigkeit begrenzen"
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "Herunter: "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr "Hochladegeschwindigkeit begrenzen"
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "Hoch: "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr "Anzahl an Transfer-Threads pro Sitzung"
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "Threads: "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Übertragung &starten"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Übertragung &abbrechen"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "&Alle entfernen"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Nach &oben schieben"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Nach &unten schieben"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "&Ganz nach oben schieben"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Gan&z nach unten schieben"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Übertragungsinformation ä&ndern"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Warteschlange aus Datei &laden"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "Warteschlange in Datei &sichern"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "S&tart"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pause"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Übertragung &hinzufügen ..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Suchen && Ersetzen ..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "&Filter anzeigen"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Seite"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+"Sind Sie sicher, dass diese Datei(en) aus der Warteschlage entfernt werden "
+"sollen?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr ""
+"Sind Sie sicher, dass ALLE Dateien aus der Warteschlage entfernt werden sollen?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Das Laden einer neuen Warteschlange wird die existierende überschreiben. Sind "
+"Sie sicher, dass Sie fortsetzen wollen?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Warteschlange laden"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Seitensitzung [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Thread %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "Leerlauf"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "nicht verbunden"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "verbinden"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "übertragen"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Status"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Im Moment laufen keine Threads."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Keine Lesezeichen."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Neu ..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "Umbe&nennen"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "Unterkategorie er&stellen ..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplizieren"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+"Bitte geben Sie Ihren Benutzernamen und Ihr Passwort ein, um eine Verbindung "
+"mit dieser Seite herzustellen."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Seite:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Name der Kategorie"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Kategorie umbenennen:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Neuer Name der Kategorie"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Neue Kategorie:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Neuer Server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Neuer Server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Sind Sie sicher, dass diese Kategorie wirklich entfernt werden soll?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Sind Sie sicher, dass dieser Server wirklich entfernt werden soll?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Das ausgewählte Importmodul kann nicht geladen werden."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Die ausgewählte Datei existiert nicht oder ist nicht lesbar."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Importieren der Lesezeichen abgeschlossen."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "Bea&rbeiten ..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL-/TLS-Einstellungen"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importieren ..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exportieren ..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Editor für FTP-Lesezeichen"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Sie sind dabei, die KFTPGrabber-Lesezeichen zu exportieren. Diese können "
+"Passwörter oder schützenswerte X509-Zertifikate enthalten. Das Exportieren der "
+"Lesezeichen kann ihre Sicherheit beeinträchtigen."
+"<br>"
+"<br>Sind Sie sicher?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Lesezeichen exportieren"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "Ordner %1 lässt sich nicht öffnen."
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Abbrechen"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Baumansicht &anzeigen"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Eigenschaften"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Vernichten"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "&Filteroptionen"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Diese Datei beim Einstellen in die Warteschlange immer &überspringen"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Diese Datei auf die &höchste Priorität setzen"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Diese Datei auf die &niedrigste Priorität setzen"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Über&tragen"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Übertragung in Warteschlange &stellen"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "Ordner er&stellen ..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Datei &öffnen"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Überprüfen ..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Mehr Aktionen"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "&Manueller Befehlseintrag ..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "Liste des Ordnerinhalts &exportieren ..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Ve&rsteckte Dateien && Ordner anzeigen"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Aktuellen Ordner im &Konqueror öffnen ..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Au&sgewählte Elemente vergleichen"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "&Ordner vergleichen"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "&RAW-Befehl senden"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "Seite ä&ndern"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Schnell&verbindung ..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "Ver&binden zu"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Trennen"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Kodierung für &Fernzugriff ändern"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Wollen Sie die aktuelle Verbindung beenden?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Sind Sie sicher, dass diese Datei VERNICHTET werden soll?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Datei vernichten"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Möchten Sie dieses Element wirklich löschen?\n"
+"Möchten Sie diese %n Elemente wirklich löschen?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Dateien löschen"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "'%1' überspringen"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "'%1' priorisieren"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Ordner erstellen"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Ordnername"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "RAW-Kommando senden"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Befehl:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Liste des Ordnerinhalts exportieren"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Identische Dateien auf beiden Seiten wurden ausgeblendet. Nur <b>"
+"unterschiedliche Dateien<b> sind im Momentsichtbar."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Allgemein"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Entfernter Ordner"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Typ:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Ort:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Größe:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Erstellt:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "Be&rechtigungen"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Zugriffsrechte"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klasse"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Einträge\n"
+"anzeigen"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Lesen"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Einträge\n"
+"schreiben"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Schreiben"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Eingeben"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Exec"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Speziell"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Benutzer"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Gruppe"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Andere"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "UID setzen"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "GID setzen"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Beibehalten"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Änderungen auf alle Unterordner und deren Inhalt anwenden"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Wurzelverzeichnis"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Pfad: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Dies ist eine SSH-verschlüsselte Verbindung. Im Moment ist keine Info über das "
+"Zertifikat verfügbar."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Optionen filtern"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Ordner filtern"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Symlinks filtern"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Groß-/Kleinschreibung beachten"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> Protokollierung initialisiert.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Datei kann nicht zum Schreiben geöffnet werden."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Die %1 XML-GUI-Beschreibungsdatei kann nicht gefunden werden. Bitte prüfen "
+"Sie, ob Sie das Programm korrekt installiert haben. Bei Fragen wenden Sie sich "
+"bitte an %2."
+"<br>"
+"<br><b>Warnung:</b> Die aktuelle Benutzeroberfläche ist nicht vollständig.</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Wenn Sie das Hauptfenster schließen, läuft KFTPGrabber im Systemabschnitt "
+"der Kontrollleiste weiter.Verwenden Sie <b>Beenden</b> aus dem <b>"
+"KFTPGrabber</b>-Menü, um die Anwendung zu beenden.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Im Systemabschnitt der Kontrollleiste einbetten"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Im Moment läuft eine Übertragung.\n"
+"Im Moment laufen %n Übertragungen."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Sind Sie sicher, dass Sie das Programm beenden möchten?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Nahe FTP-Seiten"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Seiten in KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Lesezeichen bearbeiten ..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Herunterladen: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Hochladen: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Warteschlange"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Fehlgeschlagene Übertragungen"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Nahe Seiten"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Threads"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Datenverkehr"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopie von"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Diese Lesezeichendatei ist verschlüsselt. Bitte geben Sie den Schlüssel zur "
+"Entschlüsselung ein."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Die Entschlüsselung der Lesezeichendatei ist mit dem angegebenen Schlüssel "
+"fehlgeschlagen. Sollen die Lesezeichen durch eine leere Datei <b>"
+"überschrieben</b> werden?"
+"<br>"
+"<br><font color=\"red\"><b>Warnung:</b>Wenn überschrieben wird, gehen alle "
+"vorhandenen Lesezeichen verloren.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Entschlüsselung fehlgeschlagen"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "Lesezeichen über&schreiben"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+"Bitte geben Sie den Schlüssel zur Verschlüsselung der Lesezeichendatei ein."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Keine Dienste veröffentlicht>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD nicht verfügbar>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Keine Seiten in KWallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Jannick Kuhr, Christoph Thielecke"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "jannick.kuhr@kdemail.net, crissi99@gmx.de"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "An&zeige"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Datei-Bro&wser"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Ver&steckte Dateien und Ordner anzeigen"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "&Baumansicht anzeigen"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Datei&größe in Byte anzeigen (umschalten für \"menschenlesbares\" Format)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "&Eigentümer und Gruppe für jede Datei anzeigen"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "&Ordnergröße anzeigen"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "&Andere Schnittstellenelemente"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Linke Seitenleiste anzeigen"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Suchen & Ersetzen in der Warteschlange"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Mit diesem Dialog lassen sich umfangreiche Ersetzungen von Quell- und "
+"Zielpfaden der in der Warteschlange eingestellten Übertragungen durchführen. <b>"
+"Die Änderungen können nicht rückgängig gemacht werden.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Was suchen"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Ziel:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Quelle:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Nur nach Übertragungen auf bestimmten Server suchen"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Serverinfo"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Servername:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Passwort:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Benutzername:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Ersetzen mit"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Lesezeichen-Importassistent"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Schritt 1: <b>Importmodul auswählen</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Bild"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Bitte das zugehörige Importmodul von der Liste unten auswählen. Jedes Modul "
+"kann ein anderes Format importieren."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Verfügbare Importmodule:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Schritt 2: <b>Lesezeichendatei zum Importieren auswählen</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Bitte die Lesezeichendatei, von der die Lesezeichen importiert werden sollen, "
+"angeben. Ein Standardpfad wird vom Importmodul ermittelt."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Lesezeichenpfad:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Schritt 3: <b>Lesezeichen werden importiert ...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Bitte warten, während die Lesezeichen importiert werden."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Importfortschritt:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Erscheinungsbild"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Schriftart && Farben"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Schriftart:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Farbe für Clientbefehl:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Farbe für Serverantwort:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Farbe für mehrzeilige Antwort:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Farbe für Fehlernachricht:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Farbe für Statusnachricht:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Ausgabe"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&Dateiausgabe"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Protokoll in Datei &sichern"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Ausgabedatei:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Quellserver-Info"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Zielserver-Info"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Quelle:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Ziel:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Übertragungstyp:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Ver&bindung"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP der aktiven Verbindungen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "PORT/ERPT erzwingen, um konfigurierte IP zu &verwenden"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/Hostname:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "Externe IP für LAN-Verbindungen &ignorieren"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Portbereich der aktiven Verbindungen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Ausschlie&ßlich Ports aus dem festgelegten Portbereich verwenden"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Unterer Port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Oberer Port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Zeitüberschreitungen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Zeitüberschreitung für Verbindungskontrolle (in Sekunden)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Zeitüberschreitung für Datenübertragung (in Sekunden)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Geschwindigkeitsbegrenzung"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Herunterladen (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Hochladen (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Festplatten&platz"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Überprüfung auf freien Festplattenplatz"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Übertragung abbrechen, wenn &nicht genügend freier Platz vorhanden ist"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervall (s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimaler freier Platz (MB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Thre&ads"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Anzahl der Threads pro Sitzung:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Primäre Verbindung für Übertragungen verwenden"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "Ver&schiedenes"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Fehlgeschlagenen Übertragungen automatisch wiederholen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Maximale Anzahl an Versuchen vor Markierung als fehlgeschlagen:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Andere"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"Dateien in Warteschlage einstellen (anstatt zu übertragen), wenn Sie mittels "
+"\"Ziehen und Ablegen\" eingefügt wurden"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Leere &Ordner beim Einstellen in die Warteschlange überspringen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Trennen vorher bestätigen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokoll:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP über TLS/SSL (explizit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP über TLS/SSL (implizit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP über SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Seitenname:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Entfernter Ordner:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Lokaler Ordner:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonymer Login"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Erweitert"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Erweiterten passiven Modus &deaktivieren"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Passiven Modus deaktivieren"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Seiten-IP für Verbindungen im passiven Modus verwenden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+"\"Aktiven Modus zur Verwendung dieser IP erzwingen\" für diese Seite "
+"deaktivieren"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "STAT für Liste des Ordnerinhalts verwenden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Mehrere Übertrangungsthreads"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Nicht mehrere Threads für diese Seite verwenden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Serverkodierung"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kodierung:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Wiederholen && Au&frecht erhalten"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Erneuter &Verbindungsversuch bei Fehler"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Erneuter Versuch"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Anzahl der Versuche (0 = unbegrenzt)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Wiederholungsverzögerung:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Keepalive-Pakete verwenden, um die Verbindung offen zu halten"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Aufrecht erhalten"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Frequenz (Sekunden):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII-Er&weiterungen"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Erweiterung hinzufügen"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Erweiterung:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Erweiterung"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Letzte Verbindungen"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Verbindung auswählen:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "Adresse (URL):"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Hier komplette URL eingeben"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Hostname des FTP-Server eingeben"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anon&ymer Login"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Auf anonymen Login prüfen"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Benutzername für Zugang eingeben"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Zugangspasswort eingeben"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Zu &Lesezeichen hinzufügen"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Erweitert"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Datenverbindung zur Datenverbindung"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Modus:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Datenkanal immer verschlüsseln"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Nur für Liste des Ordnerinhalts verschlüsseln"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Datenkanal nicht verschlüsseln"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509-Zertifikat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Das folgende SSL-Zertifikat beim Verbinden benutzen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Pfad:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-Mail-&Adresse"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "E-Mail-Adresse aus dem Kontrollzentrum verwenden"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-Mail:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Start und Ende"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+"Ver&lassen des Programms bestätigen, wenn aktive Übertragungen vorhanden sind"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Programm &minimiert im Systemabschnitt der Kontrollleiste starten"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Startbild&schirm beim Start anzeigen"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Symbol im S&ystemabschnitt der Kontrollleiste anzeigen"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Standardmäßig &komplett beenden bei Klick auf den X-Knopf"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Seitenvoreinstellung"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Lesezeichendatei verschl&üsseln"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Seiten aus KWallet unter Lesezeichen &anzeigen"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Benachrichtigung"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Sprechblasen"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Sprechblase &anzeigen, wenn Übertragung abgeschlossen ist"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Nur anzeigen, wenn &Warteschlange nach Übertragung leer ist"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Sprechblase anzeigen, wenn erneuter Verbindungs&versuch erfolgreich"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Datei:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "keine"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Dateiliste"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Unverarbeitet"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "OK"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Nicht gefunden"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Fehlgeschlagen"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Die Größe des Hauptfensters."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Die Position des Hauptfensters auf dem Bildschirm."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Die Standardanzahl an Wiederholungsversuchen für neue Seiten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Die Standardwiederholungsverzögerung für neue Seiten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+"Soll eine Sprechblase angezeigt werden, wenn eine Aktion abgeschlossen ist?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Soll eine Sprechblase angezeigt werden, wenn alle Übertragungen in der "
+"Warteschlange abgeschlossen sind?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Soll eine Sprechblase angezeigt werden, wenn die Verbindung zu einem Server "
+"nach einem erneuten Versuch hergestellt wurde?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+"Soll das Beenden des Programms bestätigt werden, wenn aktive Übertragungen "
+"vorhanden sind?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Verschlüsselungsstatus der Lesezeichendatei."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Lokaler Standardordner."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+"Soll die Anwendung beendet werden, wenn der Benutzer auf den X-Knopf klickt?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Soll die Anwendung minimiert gestartet werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Soll der Startbildschirm beim Start der Anwendung angezeigt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+"Soll das Symbol im Systemabschnitt der Kontrollleiste angezeigt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Sollen die Seiten aus KWallet unter den Lesezeichen angezeigt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Soll ein \"Trennen bestätigen\"-Dialog jedesmal angezeigt werden, wenn eine "
+"Verbindung getrennt wird?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Die standardmäßige Seitenkodierung."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Seiten auf die zuletzt via \"Schnellverbindung\" zugegriffen wurde."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Eine Liste von Dateimustern, bei denen der ASCII-Modus für die Übertragung "
+"verwendet werden soll."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Sollen leere Ordner übersprungen werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Die Schriftart, die für das Protokollfenster verwendet werden soll."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Die Farbe der an den Server gesendeten Befehle."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Die Farbe der Antworten des Servers."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Die Farbe mehrzeiliger Antworten des Servers."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Die Farbe von Fehlermeldungen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Die Farbe von Statusmeldungen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Soll das Protokoll auch in eine Datei geschrieben werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Die Datei, in die das Protokoll geschrieben werden soll."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Soll ein Port aus einem festgelegten Portbereich für aktive Übertragungen "
+"ausgewählt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Der Start des Portbereichs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Das Ende des Portbereichs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Soll eine IP bei aktiven Übertragungen überschrieben werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "Die zu sendende IP, wenn der PORT-Befehl überschrieben wird."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Soll die externe IP für LAN-Verbindungen ignoriert werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Sollen die Übertragungen in die Warteschlage gestellt anstatt gestartet zu "
+"werden, wenn 'Ziehen und Ablegen' verwendet wird?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Soll kftpgrabber den freien Festplattenspeicher prüfen und Übertragungen "
+"abbrechen, wenn nicht mehr genügend vorhanden ist?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Intervall für die Überprüfung der Festplatte."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Minimaler freier Speicher (in MB), der noch verfügbar sein muss."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"Global in KDE festgelegte E-Mail-Adresse für anonyme Passwörter verwenden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "Die E-Mail-Adresse, die für anonyme Passwörter verwendet werden soll."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Anzahl der Threads bei Übertragungen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Soll die primäre Verbindung für Übertragungen verwendet werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Wartezeit (in Sekunden) für die Kontrolle der Verbindung."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Wartezeit (in Sekunden) für die Datenübertragung."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Globale Begrenzung der Herunterladegeschwindigkeit (KB/s)"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Globale Begrenzung der Hochladegeschwindigkeit (KB/s)"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Sollen fehlgeschlagene Transfers automatisch wiederholt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"Maximale Anzahl an Versuchen bevor ein Transfer als fehlgeschlagen markiert "
+"wird."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Soll der Verzeichnisbaum standardmäßig angezeigt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Sollen versteckte Dateien beim Durchsuchen angezeigt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Soll die Dateigröße lieber in Bytes angezeigt werden als in "
+"\"menschenlesbarer\" Form?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Sollen der Eigentümer und die Gruppe für jede Datei angezeigt werden?"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Ordnergröße anzeigen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Linke Seitenleiste anzeigen."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Hauptmenü"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Lesezeichen-Werkzeugleiste"
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/kftpgrabber.po b/translations/el/messages/kftpgrabber.po
new file mode 100644
index 0000000..716eb02
--- /dev/null
+++ b/translations/el/messages/kftpgrabber.po
@@ -0,0 +1,2976 @@
+# translation of kftpgrabber.po to greek
+#
+# Spiros Georgaras <sngeorgaras@otenet.gr>, 2005, 2006, 2007.
+# Toussis Manolis <manolis@koppermind.homelinux.org>, 2005, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-04-19 18:04+0300\n"
+"Last-Translator: Toussis Manolis <manolis@koppermind.homelinux.org>\n"
+"Language-Team: greek <kde-i18n-el@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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "περιέχει"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "δεν περιέχει το"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "ισούται"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "δεν είναι ίσο με"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "ταιριάζει με κανονική έκφραση"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "δεν ταιριάζει με κανονική έκφραση"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "είναι το"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "δεν είναι το"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Κατάλογος"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "είναι μεγαλύτερο του"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "είναι μικρότερο του"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "bytes"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Παρακαλώ επιλέξτε μια ενέργεια."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Προτεραιότητα:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Λήψη"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Αποστολή"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+"Άγνωστη ετικέτα κατά την ανάλυση των προσαρμοσμένων εντολών του δικτυακού "
+"τόπου!"
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Η ζητούμενη λειτουργία απέτυχε! Η απάντηση του εξυπηρετητή είναι:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Ο χειριστής με όνομα <b>%1</b> δε βρέθηκε για ανάλυση απάντησης!</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Όνομα αρχείου"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Τύπος καταχώρησης"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Μέγεθος"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Αλλαγή προτεραιότητας"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Παράλειψη κατά την αναμονή"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Χρωματισμός στην προβολή λίστας"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Απόκρυψη από την προβολή λίστας"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Προορισμός με πεζά"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Ανώνυμος κανόνας"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Εισαγωγή gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Εισαγωγή KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Εισαγωγή NcFtp"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "Εισαγωγή FileZilla 3"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Όλες οι μεταφορές στην αναμονή ολοκληρώθηκαν."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Το αρχείο υπάρχει"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - ένας πελάτης FTP για το KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Ένα προαιρετικό URL για σύνδεση"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Κύριος προγραμματιστής"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Προγραμματιστής"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Κώδικας LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Κώδικας otpCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Κώδικας αναδυόμενου KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Γραφικό συστατικό κυκλοφορίας δεδομένων"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Σχεδιασμός εικονιδίου"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Δοκιμή και αποσφαλμάτωση"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Κώδικας ανάλυσης καταλόγων"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Κώδικας χειρισμού στήλης προβολής λίστας"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Η μεταφορά των παρακάτω αρχείων ολοκληρώθηκε:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Η σύνδεση με τον εξυπηρετητή απέτυχε."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Η σύνδεση με κωδικό στον εξυπηρετητή απέτυχε"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Το αρχείο πηγής δε μπορεί να βρεθεί."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Αρνήθηκε η πρόσβαση."
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr "Αδύνατο το άνοιγμα του τοπικού αρχείου για ανάγνωση ή εγγραφή."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Η μεταφορά απέτυχε για άγνωστη αιτία."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Η μεταφορά των παρακάτω αρχείων <b>εγκαταλείφθηκε</b> "
+"επειδή δεν υπάρχει αρκετός ελεύθερος χώρος στο '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Αδυναμία δημιουργίας μιας σύνδεσης SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Σύνδεση..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Συνδέθηκε στον εξυπηρετητή, προσπάθεια σύνδεσης χρήστη..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Η σύνδεση απέτυχε."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Επιτυχία ταυτοποίησης με τη χρήση πληκτρολόγησης κωδικού."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Επιτυχία ταυτοποίησης με δημόσιο κλειδί."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Αδυναμία αρχικοποίησης του καναλιού SFTP."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Αδυναμία αρχικοποίησης του SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Σε σύνδεση."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Σύνδεση..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Σύνδεση στο %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Εγκαταλείφθηκε."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Χρήση αποθηκευμένης λίστας καταλόγου."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Ανάκτηση λίστας καταλόγου..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Μεταφορά..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Λήψη αρχείου '%1'..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Αποστολή αρχείου '%1'..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Αφαίρεση..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Μετονομασία..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Τροποποίηση λειτουργίας..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Η σύνδεση απέτυχε."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"Επιτυχία διαπραγμάτευσης SSL. Η σύνδεση είναι ασφαλής με %1 bit SSL cipher %2."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "Αποτυχία διαπραγμάτευσης SSL. Η προσπάθεια σύνδεσης εγκαταλείφθηκε."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+"Αποτυχία αίτησης διαπραγμάτευσης SSL. Η προσπάθεια σύνδεσης εγκαταλείφθηκε."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "Αποτυχία διαπραγμάτευσης SSL. Η σύνδεση εγκαταλείφθηκε."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Συνδέθηκε με τον εξυπηρετητή, αναμονή για μήνυμα καλωσορίσματος..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Αποτυχία σύνδεσης (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Μη συμβατή οικογένεια διευθύνσεων για το PORT, ενώ το EPRT δεν υποστηρίζεται, "
+"εγκατάλειψη!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Γίνεται σύνδεση δεδομένων με %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Αδυναμία επίτευξης μίας υποδοχής παρακολούθησης."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Αναμονή για δεδομένα σύνδεσης στη θύρα %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Η σύνδεση δεδομένων επιτεύχθηκε."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Κανάλι δεδομένων ασφαλισμένο με %1 bit SSL."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"Η διαπραγμάτευση SSL για το κανάλι δεδομένων απέτυχε. Εγκατάλειψη μεταφοράς."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Η μεταφορά ολοκληρώθηκε."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Δημιουργία καταλόγου..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Κανένας από τους εξυπηρετητές δεν υποστηρίζει SSCN/CPSV, ενώ ζητήθηκε να γίνει "
+"σύνδεση SSL. Η μεταφορά ματαιώθηκε!"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Μεταφορά αρχείου '%1'..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Μετάδοση διατήρησης σύνδεσης..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Αποσυνδεδεμένο."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Λήξη χρονικού ορίου σύνδεσης."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Αδρανές."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Η σάρωση ολοκληρώθηκε."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Έναρξη αναδρομικής σάρωσης καταλόγου..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Αναμονή %1 δευτερολέπτων για επανασύνδεση..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Αναμονή..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Προσπάθεια επανασύνδεση (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Προσπάθεια επανασύνδεση..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Η προσπάθεια εγκαταλείφθηκε."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Ενέργειες της ύπαρξης αρχείου (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Μέγεθος/χρονική σφραγίδα"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Ίδιο"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Παλαιότερο"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Νεότερο"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Μικρότερο"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Μεγαλύτερο"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Παράλειψη"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Αντικατάσταση"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Συνέχιση"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Μετονομασία"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Ερώτηση"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Καταγραφή (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Τοπική συνεδρία"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Καταγραφή"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Η σύνδεση με %1 δημιουργήθηκε επιτυχώς."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Παρακαλώ δώστε το ιδιωτικό σας κλειδί αποκρυπτογράφησης."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Συνεδρία"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Τουλάχιστον μια συνεδρία πρέπει να μείνει ανοικτή σε κάθε πλευρά."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+"Παρακαλώ ολοκληρώστε όλες τις μεταφορές πριν το κλείσιμο της συνεδρίας."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Η συνεδρία είναι για την ώρα συνδεδεμένη. Είστε σίγουροι ότι επιθυμείτε την "
+"αποσύνδεση;"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Κλείσιμο συνεδρίας"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Γρήγορη &σύνδεση..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Νέα συνεδρία"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Αριστερή πλευρά"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Δεξιά πλευρά"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&Λειτουργία μεταφοράς (αυτόματο)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Δυαδικό"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Αυτόματο"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&Λειτουργία μεταφοράς (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&Λειτουργία μεταφοράς (Δυαδικό)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Επιλογή..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Χωρίς όνομα"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Μεταφορά"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Περιγραφή"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Δεν υπάρχουν αποτυχημένες μεταφορές."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Επανεκκίνηση μεταφοράς"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Προσθήκη στην αναμονή"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Προσθήκη όλων στην αναμονή"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Αφαίρεση"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Αφαίρεση όλων"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Επιθυμείτε σίγουρα την αφαίρεση αυτής της αποτυχημένης μεταφοράς;"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Επιθυμείτε σίγουρα την αφαίρεση όλων των αποτυχημένων μεταφορών;"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Φόρμα1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Νέο μοτίβο"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Μοτίβο ονόματος αρχείου:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Χρώμα:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Γρήγορη σύνδεση"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Καθαρισμός της λίστας προσφάτων δικτυακών τόπων;"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "ένα όνομα υπολογιστή"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "μια έγκυρη θύρα"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "το όνομα χρήστη σας"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "τον κωδικό πρόσβασης σας"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " και"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Παρακαλώ εισάγετε "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Παρακαλώ δώστε τον κωδικό αποκρυπτογράφησης πιστοποίησης X509."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Δικτυακοί τόποι κοντά σας"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Δε δημοσιεύθηκαν δικτυακοί τόποι."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Μοτίβο"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Χρώμα"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Προσθήκη μοτίβου"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Ενεργοποιημένο"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Τονισμός"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Δεν έχει υλοποιηθεί ακόμα.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Παράλειψη λίστας"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Επεκτάσεις ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Γενικά"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Μεταφορές"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Εμφάνιση"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Ενέργειες"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Φίλτρα"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Επαλήθευση αθροίσματος ελέγχου"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Άθροισμα ελέγχου"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Η επαλήθευση ολοκληρώθηκε!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Αδύνατο το άνοιγμα του αρχείου αθροίσματος ελέγχου ή το αρχείο έχει εσφαλμένη "
+"μορφή!"
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Φίλτρο &ενεργοποιημένο"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Κανένα φίλτρο."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Πάνω"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Κάτω"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Μετονομασία..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Νέο"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Μετονομασία κανόνα"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Μετονομασία κανόνα '%1' σε:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Συνθήκες"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Ταιριάζει με ό&λα τα παρακάτω"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Ταιριάζει σε κάποιο από τα παρακάτ&ω"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Αναζήτηση & αντικατάσταση"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Χρήση εύρους δικτύου"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Περισσότερα"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Λιγότερα"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Καθαρισμός"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "σταματημένο"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "εκτελείται"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Αναμονή για σύνδεση..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Φίλτρο: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Όνομα"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Πηγή"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Προορισμός"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Πρόοδος"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Ταχύτητα"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "XA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Δεν έχετε κάποια αρχεία σε αναμονή."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr "Περιορισμός ταχύτητας λήψης"
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "Λήψη: "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr "Περιορισμός ταχύτητας αποστολής"
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "Αποστ: "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr "Μέτρηση νημάτων μεταφοράς ανά συνεδρία"
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "Νήματα: "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Εκκίνηση μεταφοράς"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Εγ&κατάλειψη μεταφοράς"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Αφαίρεση ό&λων"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Μετακίνηση &πάνω"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Μετακίνηση &κάτω"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Μετακίνηση στη κορυ&φή"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Μετακίνηση στον πά&το"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Αλλαγή πληροφοριών μεταφοράς"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Φόρτωση λίστας αναμονής από αρχείο"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Αποθήκευση λίστας αναμονής σε αρχείο"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "Ε&κκίνηση"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Παύση"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Προσθήκη μεταφοράς..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Αναζήτηση && αντικατάσταση..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Εμφάνιση &φίλτρου"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Δικτυακός τόπος"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Επιθυμείτε σίγουρα την αφαίρεση των αρχείων από την αναμονή;"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Επιθυμείτε σίγουρα την αφαίρεση όλων των αρχείων από την αναμονή;"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Η φόρτωση μιας νέας λίστας αναμονής θα αντικαταστήσει την υπάρχουσα, επιθυμείτε "
+"σίγουρα να συνεχίσετε;"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Φόρτωμα λίστας αναμονής"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Συνεδρία δικτυακού τόπου [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Νήμα %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "αδρανές"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "αποσύνδεση"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "σύνδεση"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "μεταφορά"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Κατάσταση"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Δεν υπάρχουν αυτή τη στιγμή νήματα που εκτελούνται."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Χωρίς σελιδοδείκτες."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Νέο..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Μετονομασία"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Δημιουργία υποκατηγορίας..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Αντίγραφο"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+"Παρακαλώ εισάγετε το όνομα χρήστη και κωδικό για τη σύνδεση με αυτό το δικτυακό "
+"τόπο."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Δικτυακός τόπος:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Όνομα κατηγορίας"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Μετονομασία κατηγορίας:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Νέο όνομα κατηγορίας"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Νέα κατηγορία:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Νέος εξυπηρετητής"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Νέος εξυπηρετητής"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Επιθυμείτε σίγουρα την αφαίρεση αυτής της κατηγορίας;"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Επιθυμείτε σίγουρα την αφαίρεση αυτού του εξυπηρετητή;"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Αδυναμία φόρτωσης του επιλεγμένου πρόσθετου εισαγωγής."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Το επιλεγμένο αρχείο δεν υπάρχει ή δεν είναι αναγνώσιμο."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Η εισαγωγή σελιδοδεικτών ολοκληρώθηκε."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Επεξεργασία..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Ρυθμίσεις SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Εισαγωγή..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Εξαγωγή..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Επεξεργαστής σελιδοδεικτών FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Πρόκειται να εξάγετε τους σελιδοδείκτες σας του KFTPGrabber. Αυτοί μπορεί "
+"να περιέχουν κωδικούς ή ευαίσθητες πιστοποιήσεις X509: η αποστολή των "
+"σελιδοδεικτών σας μπορεί να εκθέσει την ασφάλειά τους."
+"<br>"
+"<br>Είστε σίγουροι;</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Εξαγωγή σελιδοδεικτών"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "Αδύνατη η είσοδος στο φάκελο %1."
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Εγκατάλειψη"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Εμφάνιση προβολής δέντρου"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Ιδιότητες"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Τεμαχισμός"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Επιλογές &φίλτρων"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Πάντα πα&ράλειψη αυτού του αρχείου για την αναμονή"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Υ&ψηλή προτεραιότητα του αρχείου αυτού"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "&Χαμηλή προτεραιότητα του αρχείου αυτού"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Μεταφορά"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Αναμονή μεταφοράς"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Δημιουργία καταλόγου..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Ά&νοιγμα αρχείου"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Επαλήθευση..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Περισσότερες ενέργειες"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "&Χειροκίνητη εισαγωγή εντολής..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Εξαγωγή λίστας καταλόγου..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Εμφάνιση &κρυφών αρχείων && καταλόγων"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Άνοιγμα του τρέχοντος καταλόγου στον &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "&Σύγκριση των επιλεγμένων αντικειμένων"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Σύγκριση &καταλόγων"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Αποστολή ά&μεσης εντολής"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Αλλαγή δικτυακού τόπου"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Γρήγορη σύνδεση..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Σύνδεση με"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Αποσύνδεση"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Αλλαγή απομακρυσμένης &κωδικοποίησης"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Επιθυμείτε την απόρριψη της τρέχουσας σύνδεσης;"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Επιθυμείτε πραγματικά τον τεμαχισμό αυτού του αρχείου;"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Τεμαχισμός αρχείου"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Θέλετε πραγματικά να διαγράψετε αυτό το αντικείμενο;\n"
+"Θέλετε πραγματικά να διαγράψετε αυτά τα %n αντικείμενα;"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Διαγραφή αρχείων"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Παράλειψη '%1'"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Προτεραιότητα '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Δημιουργία καταλόγου"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Όνομα καταλόγου:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Αποστολή άμεσης εντολής"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Εντολή:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Εξαγωγή λίστας καταλόγου"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Έγινε απόκρυψη των όμοιων αρχείων και στις δύο πλευρές. Εμφανίζονται μόνο τα <b>"
+"διαφορετικά αρχεία</b>."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Γενικά"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Απομακρυσμένος φάκελος"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Άγνωστο"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Τύπος:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Τοποθεσία:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Μέγεθος:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Δημιουργήθηκε:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "Ά&δειες"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Άδειες πρόσβασης"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Κλάση"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Εμφάνιση\n"
+"καταχωρήσεων"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Ανάγνωση"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Εγγραφή\n"
+"καταχωρήσεων"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Εγγραφή"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Εισαγωγή"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Εκτέλεση"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Ειδικό"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Χρήστης"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Ομάδα"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Άλλα"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Ορισμός UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Ορισμός GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Κολλημένο"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Εφαρμογή των αλλαγών σε όλους τους υποφακέλους και τα περιεχόμενά τους"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Ριζικός κατάλογος"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Διαδρομή: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Αυτή είναι μια κρυπτογραφημένη SSH σύνδεση. Δεν υπάρχουν διαθέσιμες πληροφορίες "
+"πιστοποίησης αυτή τη στιγμή."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Επιλογές φίλτρων"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Κατάλογοι φίλτρων"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Συμβολικοί δεσμοί φίλτρων"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Διάκριση πεζών/κεφαλαίων"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> ο καταγραφέας αρχικοποιήθηκε.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Αδύνατο το άνοιγμα του αρχείου για εγγραφή."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Αδυναμία εύρεσης του αρχείου περιγραφής GUI %1 σε XML. Παρακαλώ ελέγξτε ότι "
+"έχετε εγκαταστήσει την εφαρμογή σωστά! Αν έχετε κάποιες ερωτήσεις μπορείτε να "
+"τις ρωτήσετε στο%2."
+"<br>"
+"<br><b>Προειδοποίηση:</b> Το τρέχον γραφικό περιβάλλον θα είναι μη "
+"ολοκληρωμένο!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Κλείνοντας το κύριο παράθυρο το KFTPGrabber θα συνεχίσει να εκτελείται στο "
+"πλαίσιο του συστήματος. Χρησιμοποιήστε την <b>Έξοδο</b> από το μενού του <b>"
+"KFTPGrabber</b> για τον τερματισμό της εφαρμογής.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Προσάρτηση στο πλαίσιο συστήματος"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Υπάρχει μια μεταφορά σε εξέλιξη.\n"
+"Υπάρχουν %n μεταφορές σε εξέλιξη."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Είστε σίγουροι για την έξοδο;"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP δικτυακοί τόποι κοντά μου"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Δικτυακοί τόποι στο KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Επεξεργασία σελιδοδεικτών..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Λήψη: %1/δευτ"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Αποστολή: %1/δευτ"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Αναμονή"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Αποτυχημένες μεταφορές"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Δικτυακοί τόποι κοντά μου"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Νήματα"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Κυκλοφορία"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Αντιγραφή του"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Το αρχείο σελιδοδεικτών είναι κρυπτογραφημένο. Παρακαλώ εισάγετε κλειδί "
+"αποκρυπτογράφησης."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Η αποκρυπτογράφηση του αρχείου σελιδοδεικτών απέτυχε με το δοσμένο κλειδί. "
+"Επιθυμείτε την <b>αντικατάσταση</b> των σελιδοδεικτών με ένα κενό αρχείο;"
+"<br>"
+"<br><font color=\"red\"><b>Προειδοποίηση:</b> Αν γίνει αντικατάσταση, όλοι οι "
+"τρέχοντες σελιδοδείκτες θα χαθούν.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Η αποκρυπτογράφηση απέτυχε"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Αντικατάσταση σελιδοδεικτών"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Εισάγετε κλειδί για κρυπτογράφηση του αρχείου σελιδοδεικτών."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Δε δημοσιεύτηκαν υπηρεσίες>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<Το DNSSD μη διαθέσιμο>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Δεν υπάρχουν δικτυακοί τόποι στο KWallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Σπύρος Γεωργαράς,Τούσης Μανώλης"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "sngeorgaras@otenet.gr,manolis@koppermind.homelinux.org"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Εμ&φάνιση"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Περιήγηση αρχείων"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Εμφάνιση &κρυφών αρχείων και καταλόγων"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Εμφάνιση δέντρου κα&ταλόγων"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "Εμφάνιση με&γέθους αρχείου σε bytes (εναλλαγή \"ευανάγνωστης\" μορφής)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Εμφάνιση &ιδιοκτήτη και ομάδας κάθε αρχείου"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Εμφάνιση μεγέ&θους καταλόγου"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "Ά&λλα στοιχεία του περιβάλλοντος"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Εμφάνιση της γραμμής κύλισης στα δεξιά"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Αναζήτηση & αντικατάσταση αναμονής"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Χρησιμοποιώντας αυτόν το διάλογο, μπορείτε να εκτελέσετε ομαδική αντικατάσταση "
+"των διαδρομών πηγής/προορισμού των μεταφορών σε αναμονή. <b>"
+"Οι τροποποιήσεις δεν είναι δυνατό να αναιρεθούν.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Αναζήτηση για"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Προορισμός:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Πηγή:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Αναζήτηση μεταφορών μόνο σε συγκεκριμένο εξυπηρετητή"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Πληροφορίες εξυπηρετητή"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Όνομα εξυπηρετητή:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Υπολογιστής:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Κωδικός πρόσβασης:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Όνομα χρήστη:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Θύρα:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Αντικατάσταση με"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Μάγος εισαγωγής σελιδοδεικτών"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Βήμα 1: <b>Επιλέξτε το πρόσθετο εισαγωγής</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Εικόνα"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Παρακαλώ επιλέξτε το κατάλληλο πρόσθετο εισαγωγής από την παρακάτω λίστα. Κάθε "
+"πρόσθετο μπορεί να εισάγει και μια διαφορετική μορφή."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Διαθέσιμα πρόσθετα εισαγωγής:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Βήμα 2: <b>Επιλέξτε το αρχείο σελιδοδεικτών για εισαγωγή</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Παρακαλώ επιλέξτε το αρχείο σελιδοδεικτών από το οποίο επιθυμείτε την εισαγωγή "
+"των σελιδοδεικτών σας. Ορίστηκε μια προκαθορισμένη διαδρομή ήδη από το πρόσθετο "
+"εισαγωγής."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Διαδρομή σελιδοδεικτών:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Βήμα 3: <b>Εισαγωγή σελιδοδεικτών...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Παρακαλώ περιμένετε καθώς εισάγονται οι σελιδοδείκτες."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Πρόοδος εισαγωγής:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Εμφάνιση"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Γραμματοσειρά && χρώματα"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Γραμματοσειρά:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Χρώμα εντολής πελάτη:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Χρώμα απάντησης εξυπηρετητή:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Χρώμα απάντησης πολλών γραμμών:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Χρώμα μηνύματος σφάλματος:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Χρώμα μηνύματος κατάστασης:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "Έ&ξοδος"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Έξοδος α&ρχείου"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Απο&θήκευση καταγραφής σε αρχείο"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Αρχείο εξόδου:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Πληροφορίες εξυπηρετητή πηγής"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Πληροφορίες εξυπηρετητή προορισμού"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Πηγή:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Προορισμός:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Τύπος μεταφοράς:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Σύ&νδεση"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "Ενεργή σύνδεση IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Εξαναγκασμός PORT/EPRT να κάνει &χρήση ρυθμισμένης IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/υπολογιστής:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "Α&γνόηση εξωτερικών IP για συνδέσεις LAN"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Εύρος θυρών ενεργής σύνδεσης"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Χρήση θυρών &μόνο από το ορισμένο εύρος θυρών"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Κατώτερη θύρα:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Ανώτερη θύρα:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Χρονικά όρια"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Χρονικό όριο ελέγχου σύνδεσης (δευτερόλεπτα):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Χρονικό όριο μεταφοράς δεδομένων (δευτερόλεπτα):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Όριο ταχύτητας"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Λήψη (KB/δευτ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Αποστολή (KB/δευτ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Χώρος στο δίσ&κο"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Έλεγχος ελεύθερου χώρου του δίσκου"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Σταμάτημα της μεταφοράς αν &δεν υπάρχει αρκετός ελεύθερος χώρος"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Χρονικό διάστημα (δευτ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Ελάχιστος ελεύθερος χώρος (MB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Νή&ματα"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Αριθμός νημάτων ανά συνεδρία:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Χρήση της κύριας σύνδεσης για μεταφορές"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Διάφορα"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Αυτόματη επανεκκίνηση αποτυχημένων μεταφορών"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Μέγιστος αριθμός προσπαθειών για χαρακτηρισμό ως αποτυχημένης:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Άλλα"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"Αρχεία σε ανα&μονή (αντί για μεταφορά) όταν γίνει \"σύρσιμο && ελευθέρωση\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Παράλειψη κενών καταλό&γων για την αναμονή"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Επιβεβαίωση αποσυνδέσεων &πριν την αποσύνδεση"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Όνομα υπολογιστή:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Πρωτόκολλο:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP με TLS/SSL (άμεσα)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP με TLS/SSL (έμμεσα)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP με SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Ετικέτα δικτυακού τόπου:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Απομακρυσμένος κατάλογος:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Τοπικός κατάλογος:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Ανώνυμη σύνδεση"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Προχωρημένα"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Α&πενεργοποίηση χρήσης εκτεταμένης παθητικής λειτουργίας"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Απενεργοποίηση χρήσης παθητικής λειτουργίας"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Χρήσης του IP του δικτυακού τόπου για συνδέσεις παθητικής λειτουργίας"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+"Απενεργοποίηση \"εξαναγκασμού ενεργητικής λειτουργία για αυτό το IP\" για αυτό "
+"το δικτυακό τόπο"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Χρήση του STAT για λίστες καταλόγου"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Πολλαπλά νήματα μεταφοράς"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Να μη γίνει χρήση πολλαπλών νημάτων γι' αυτό το δικτυακό τόπο"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Κωδικοποίηση εξυπηρετητή"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Κωδικοποίηση:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Προσπάθεια ξανά && διατή&ρηση σύνδεσης"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Ξανα&προσπαθήστε σύνδεση σε αποτυχία"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Ξαναπροσπαθήστε"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Αριθμός προσπαθειών (0 = άπειρος):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Καθυστέρηση προσπάθειας:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Χρήση πακέτων για τη διατήρηση της σύνδεσης ανοιχτής"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Διατήρηση σύνδεσης"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Συχνότητα πακέτων διατήρησης σύνδεσης (δεύτερα):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "Επε&κτάσεις ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Προσθήκη επέκτασης"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Επέκταση:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Επέκταση"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Πρόσφατες συνδέσεις"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Επιλογή σύνδεσης:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Εισάγετε το πλήρες url σε αυτό το πλαίσιο"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Εισαγωγή ονόματος υπολογιστή ftp"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Α&νώνυμη σύνδεση"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Ενεργοποιήστε αυτή την επιλογή για ανώνυμη σύνδεση"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Εισαγωγή όνομα χρήστη λογαριασμού"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Εισαγωγή κωδικού πρόσβασης λογαριασμού"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Προσθήκη στους &σελιδοδείκτες"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Προχωρημένα"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Ρυθμίσεις σύνδεσης δεδομένων"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Λειτουργία:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Πάντα κρυπτογράφηση του καναλιού δεδομένων"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Κρυπτογράφηση μόνο περιεχομένων καταλόγων"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Χωρίς κρυπτογράφηση του καναλιού δεδομένων"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Πιστοποίηση X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Χρήση της παρακάτω πιστοποίησης SSL κατά τη σύνδεση"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Διαδρομή:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "Διεύθυνση ηλεκτρονικής &αλληλογραφίας"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Χρήση ηλεκτρονικής διεύθυνσης από το κέντρο ελέγχου"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-mail:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Έναρξη και έξοδος"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Επιβεβαίωση της ε&ξόδου αν υπάρχουν ενεργές μεταφορές"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Εκκίνηση προγράμματος ε&λαχιστοποιημένο στο πλαίσιο συστήματος"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Εμφάνιση οθόνης &εισαγωγής κατά την εκκίνηση"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Εμφάνιση εικονιδίου στο πλαίσιο σ&υστήματος"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Έ&ξοδος με κλικ στο κουμπί Χ"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Προκαθορισμένα δικτυακού τόπου"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "&Κρυπτογράφηση αρχείου σελιδοδεικτών"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Εμφάνιση δικτυακών τόπων του KWallet στους &σελιδοδείκτες"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Ειδοποίηση"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Μπαλόνια"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Εμφάνιση &μπαλονιού όταν ολοκληρωθεί η μεταφορά"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Εμφάνιση μόνο όταν η α&ναμονή είναι κενή μετά τη μεταφορά"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Εμφάνιση μπαλονιού όταν η &προσπάθεια σύνδεσης επιτύχει"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Αρχείο:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "κανένα"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Λίστα αρχείων"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Μη επεξεργασμένο"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Εντάξει"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Δε βρέθηκε"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Απέτυχε"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Το μέγεθος του κύριου παραθύρου."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Η θέση του κύριου παραθύρου στην οθόνη."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Ο προκαθορισμένος αριθμός προσπαθειών για νέους δικτυακούς τόπους."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+"Η προκαθορισμένη καθυστέρηση προσπάθειας ξανά για νέους δικτυακούς τόπους."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Αν θα εμφανίζεται ένα μπαλόνι όταν ολοκληρωθούν κάποιες ενέργειες."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Αν θα εμφανίζεται ένα μπαλόνι όταν ολοκληρωθούν όλες οι μεταφορές σε αναμονή."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Αν θα εμφανίζεται ένα μπαλόνι όταν γίνει σύνδεση στον εξυπηρετητή μετά από "
+"προσπάθεια ξανά."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Αν θα επιβεβαιώνει ο χρήστης την έξοδο αν υπάρχουν ενεργές μεταφορές."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Κατάσταση κρυπτογράφησης του αρχείου σελιδοδεικτών."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Προκαθορισμένος τοπικός κατάλογος."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+"Αν η εφαρμογή θα τερματίζεται αν ο χρήστης κάνει κλικ στο κουμπί με το Χ."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Αν η εφαρμογή θα εκκινείται ελαχιστοποιημένη."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Αν θα εμφανίζεται η εισαγωγική οθόνη κατά την εκκίνηση της εφαρμογής."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Αν θα εμφανίζεται εικονίδιο στο πλαίσιο συστήματος."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+"Αν οι δικτυακοί τόποι από το KWallet θα εμφανίζονται στους σελιδοδείκτες."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Αν θα εμφανίζεται ένας διάλογος \"επιβεβαίωσης αποσύνδεσης\" κάθε φορά που "
+"επιχειρείται αποσύνδεση."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Η προκαθορισμένη κωδικοποίηση του δικτυακού τόπου."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+"Πρόσφατοι δικτυακοί τόποι που προσπελάστηκαν μέσω της γρήγορης σύνδεσης."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Μια λίστα μοτίβων αρχείων για τα οποία θα χρησιμοποιηθεί λειτουργία ASCII για "
+"τη μεταφορά."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Αν θα γίνεται παράλειψη των κενών καταλόγων."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+"Η γραμματοσειρά που θα χρησιμοποιηθεί για το γραφικό συστατικό καταγραφής."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Το χρώμα των εντολών που αποστέλλονται στον εξυπηρετητή."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Το χρώμα των απαντήσεων από τον εξυπηρετητή."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Το χρώμα των απαντήσεων πολλών γραμμών από τον εξυπηρετητή."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Το χρώμα των μηνυμάτων σφάλματος."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Το χρώμα των μηνυμάτων κατάστασης."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Αν η καταγραφή θα εγγράφεται και σε ένα αρχείο."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Το αρχείο στο οποίο θα εγγράφεται η καταγραφή."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Αν θα επιλέγεται μια θύρα από ένα ορισμένο εύρος για ενεργές μεταφορές."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Η αρχή του εύρους θυρών."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Το τέλος του εύρους θυρών."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Αν θα αγνοείται μια IP κατά τις ενεργές μεταφορές."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "Η IP που θα αποσταλεί όταν αγνοείται η εντολή PORT."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Αν η εξωτερική IP θα αγνοείται για συνδέσεις τοπικού δικτύου."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Αν οι μεταφορές θα τοποθετούνται σε αναμονή κατά τη χρήση του 'σύρσιμο και "
+"ελευθέρωση'."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Αν το kftpgrabber θα ελέγχει για ελεύθερο χώρο και θα εγκαταλείπει τη μεταφορά "
+"όταν δεν υπάρχει αρκετός ελεύθερος."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Χρονικό διάστημα ελέγχου του δίσκου."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Ο ελάχιστος ελεύθερος χώρος (σε MB) που πρέπει να είναι διαθέσιμος."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"Χρήση της καθολικής ηλεκτρονικής διεύθυνσης του KDE για ανώνυμο κωδικό "
+"πρόσβασης."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+"Η ηλεκτρονική διεύθυνση που θα χρησιμοποιηθεί ως ανώνυμος κωδικός πρόσβασης."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Αριθμός των νημάτων που θα χρησιμοποιηθούν για τη μεταφορά."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Αν θα χρησιμοποιείται η κύρια σύνδεση για μεταφορές."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Χρονικό όριο (δευτερόλεπτα) για τον έλεγχο σύνδεσης."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Χρονικό όριο (δευτερόλεπτα) για μεταφορές δεδομένων."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Καθολικό όριο ταχύτητας λήψης (kbytes/δευτ)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Καθολικό όριο ταχύτητας αποστολής (kbytes/δευτ)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Αν θα γίνεται αυτόματη προσπάθεια ξανά για τις αποτυχημένες λήψεις."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"Μέγιστος αριθμός προσπαθειών για τη σήμανση της μεταφοράς ως αποτυχημένη."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Αν θα εμφανίζεται το δέντρο καταλόγων προκαθορισμένα."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Αν θα εμφανίζονται τα κρυφά αρχεία κατά την περιήγηση."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Αν το μέγεθος αρχείων θα εμφανίζεται σε bytes ή σε πιο \"ευανάγνωστη\" μορφή."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Αν θα εμφανίζεται ο ιδιοκτήτης και η ομάδα κάθε αρχείου."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Εμφάνιση μεγέθους καταλόγου."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Εμφάνιση της γραμμής κύλισης στα αριστερά."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Κύριο μενού"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Γραμμή εργαλείων σελιδοδεικτών"
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/kftpgrabber.po b/translations/en_GB/messages/kftpgrabber.po
new file mode 100644
index 0000000..8ba4fef
--- /dev/null
+++ b/translations/en_GB/messages/kftpgrabber.po
@@ -0,0 +1,3721 @@
+# translation of kftpgrabber.po to British English
+# Andrew Coles <andrew_coles@yahoo.co.uk>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2005-06-21 14:46+0100\n"
+"Last-Translator: Andrew Coles <andrew_coles@yahoo.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.9\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "connecting"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Directory"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Download"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Upload"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+#, fuzzy
+msgid "Filename"
+msgstr "Filename:"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Size"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "&Change Site"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Destination"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP import"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+#, fuzzy
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp import"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "All queued transfers have been completed."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "File Exists"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - an FTP client for KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Lead developer"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Developer"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH code"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc code"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon popup code"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Traffic graph widget"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Icon design"
+
+#: src/main.cpp:72 src/main.cpp:73
+#, fuzzy
+msgid "Testing and debugging"
+msgstr "Testing & debugging"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Directory name:"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Transfer of the following files is complete:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "Connection to '%1' has failed."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "File transfer has failed."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Source file cannot be found."
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Permissions"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Unable to open file for writing."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Unable to establish SSH connection (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Logging in..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Login failed."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Unable to initialise SFTP channel."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Unable to initialise SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "disconnected"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Connecting..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Connecting to '%1:%2'..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Abort"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "Fetching directory listing..."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Fetching directory listing..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Transferring..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Removing directories..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Rename"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Connection to '%1' has failed."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Unable to connect."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Retrying connection (%1/%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Unable to establish TLS connection."
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Retrying connection..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Connection established."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "FXP transfer completed."
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Scanning directories..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Transferring..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "disconnected"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Connection to '%1' has failed."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Idle."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Directory listing complete."
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Fetching directory listing..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Waiting %1 seconds before reconnect..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Rename"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Retrying connection..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Retrying connection..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Retry aborted."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "On File Exists Actions (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Size/Timestamp"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Same"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Older"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Newer"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Smaller"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Bigger"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Skip"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Overwrite"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Resume"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Rename"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Ask"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Log (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Local Session"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Connection with %1 has been successfully established."
+
+#: src/kftpsession.cpp:388
+#, fuzzy
+msgid "Please provide your private key decryption password."
+msgstr "Please provide your X509 certificate decryption password."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Session"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "At least one session must remain open on each side."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Please finish all transfers before closing the session."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Close Session"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Quick &Connect..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&New Session"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Left Side"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Right Side"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&Transfer Mode (Auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binary"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&Transfer Mode (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&Transfer Mode (Binary)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Select..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "No name"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Transfer"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Description"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "There are no failed transfers."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Restart Transfer"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Add To Queue"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Add All To Queue"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "R&emove"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Remove All"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Are you sure you want to remove this failed transfer?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Are you sure you want to remove ALL failed transfers?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "New Pattern"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Filename pattern:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Colour:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Quick Connect"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "a hostname"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "a valid port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "your username"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "your password"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " and"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Please enter "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Please provide your X509 certificate decryption password."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Sites Near You"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "No sites published."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Pattern"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Colour"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Add pattern"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Enabled"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Highlighting"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Not yet implemented.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Skip List"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII xtensions"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "General"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Transfers"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Display"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Actions"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+#, fuzzy
+msgid "Filters"
+msgstr "Filter"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr ""
+
+#: src/widgets/verifier.cpp:137
+#, fuzzy
+msgid "Verification complete!"
+msgstr "Directory listing complete."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Filename:"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filter"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Download"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Rename"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Newer"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Rename"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "&Connect To"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Search & Replace"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Bandwidth usage"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "stalled"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "running"
+
+#: src/widgets/queueview/queueview.cpp:303
+#, fuzzy
+msgid "Waiting for connection..."
+msgstr "Retrying connection..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Name"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Source"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Destination"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Progress"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Speed"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "You do not have any files in the queue."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Download"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Threads"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Start Transfer"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Abort Transfer"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Remove &All"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Move &Up"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Move &Down"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Move &Up"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Change Transfer Info"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Load Queue From File"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Save Queue to File"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "S&tart"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pause"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Add Transfer..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Search && Replace..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+#, fuzzy
+msgid "Show &Filter"
+msgstr "Filter"
+
+#: src/widgets/queueview/queueview.cpp:704
+#, fuzzy
+msgid "Site"
+msgstr "Size"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Are you sure you want to remove queued file(s)?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Are you sure you want to remove ALL queued files?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Load Queue"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Site session [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Thread %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "idle"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "disconnected"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "connecting"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "transferring"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Status"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "There are no threads currently running."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "No bookmarks."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&New..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Rename"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Create Subcategory..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplicate"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Size"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Category Name"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Rename category:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "New Category Name"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "New category:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "New server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "New Server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Are you sure you want to remove this category?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Are you sure you want to remove this server?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Unable to load the selected import plugin."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "The selected file does not exist or is not readable."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Bookmark importing is complete."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Edit..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS Settings"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Import..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+#, fuzzy
+msgid "Export..."
+msgstr "Import..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP Bookmark Editor"
+
+#: src/widgets/bookmarks/editor.cpp:197
+#, fuzzy
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>"
+". They may contain passwords or sensitive X509 certificates: sending your "
+"bookmarks may compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+#, fuzzy
+msgid "Export Bookmarks"
+msgstr "Edit Bookmarks..."
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Abort"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Show Tree View"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Properties"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Shred"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Filter"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Transfer"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Queue Transfer"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Create Directory..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&More Actions"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+#, fuzzy
+msgid "&Export Directory Listing..."
+msgstr "Fetching directory listing..."
+
+#: src/widgets/browser/actions.cpp:136
+#, fuzzy
+msgid "Show &Hidden Files && Directories"
+msgstr "Show hidden files and directories"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Create Directory"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Send Raw Command"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Change Site"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Quick Connect..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Connect To"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Disconnect"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Change Remote &Encoding"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Do you want to drop current connection?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Are you sure you want to SHRED this file?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Shred File"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Delete File"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Skip"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Port:"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Create Directory"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Directory name:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Send Raw Command"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Command:"
+
+#: src/widgets/browser/actions.cpp:648
+#, fuzzy
+msgid "Export Directory Listing"
+msgstr "Fetching directory listing..."
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&General"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Remote folder"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Unknown"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Type:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Location:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Size:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Created:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Permissions"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Access Permissions"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Class"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Show\n"
+"Entries"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Read"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Write\n"
+"Entries"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Write"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Enter"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Exec"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Special"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "User"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Group"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Others"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Set UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Set GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Root directory"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Path: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Filter"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Create Directory"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "File Exists"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "&Change Site"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> logger initialised.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Unable to open file for writing."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Docking in System Tray"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"There is currently a transfer running.\n"
+"There are currently %n transfers running."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Are you sure you want to quit?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP Sites Near Me"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Sites In KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Edit Bookmarks..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Download: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Upload: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Queue"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Failed Transfers"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Sites Near Me"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Threads"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Traffic"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Copy of"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "This bookmark file is encrypted. Please enter key for decryption."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Decryption Failed"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Overwrite Bookmarks"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Enter key for bookmark file encryption."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<No Services Published>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD Not Available>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<No Sites In KWallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Displa&y"
+msgstr "Display"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "File &Browser"
+msgstr "Failed Transfers"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Show hidden files and directories"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "Show &directory tree"
+msgstr "Root directory"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Root directory"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Filter"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Queue Search & Replace"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Using this dialogue, you can do massive replacing of source/destination paths "
+"of the queued transfers. <b>Changes cannot be undone.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Search What"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destination:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Source:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Search only for transfers on specific server"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Server Info"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Server name:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Password:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Username:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Replace With"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Bookmark Import Wizard"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Step 1: <b>Select Import Plugin</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Image"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Available import plugins:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Step 2: <b>Select Bookmark File to Import</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Bookmark path:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Step 3: <b>Importing Bookmarks...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Please wait while the bookmarks are being imported."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Import progress:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, fuzzy, no-c-format
+msgid "Font && Colors"
+msgstr "Log Output Fonts && Colours"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, fuzzy, no-c-format
+msgid "Font:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Client command colour:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Server response colour:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Multiline response colour:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, fuzzy, no-c-format
+msgid "Error message color:"
+msgstr "Error colour:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Status message colour:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, fuzzy, no-c-format
+msgid "&Output"
+msgstr "File Output"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, fuzzy, no-c-format
+msgid "&File Output"
+msgstr "File Output"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, fuzzy, no-c-format
+msgid "&Save log to file"
+msgstr "Save log to file"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Source Server Info"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Destination Server Info"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Source:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Destination:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Transfer type:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, fuzzy, no-c-format
+msgid "Co&nnection"
+msgstr "&Connect To"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, fuzzy, no-c-format
+msgid "Active Connection IP"
+msgstr "Active Connection Settings"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, fuzzy, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Force PORT/EPRT to use configured IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, fuzzy, no-c-format
+msgid "IP/hostname:"
+msgstr "Hostname:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, fuzzy, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Active Connection Settings"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, fuzzy, no-c-format
+msgid "Speed limit"
+msgstr "Speed"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Download (KB/s):"
+msgstr "Download: %1/s"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Upload: %1/s"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Dis&k Space"
+msgstr "Free Disk Space Check"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Free Disk Space Check"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Stop transfer if there is not enough free space"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Interval (sec):"
+msgstr "Disk check interval (sec):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimum free space (Mb):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Thre&ads"
+msgstr "Threads"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Number of threads per session:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "There are no failed transfers."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Other"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Skip empty directories"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "ftpSiteProperties"
+msgstr "&Properties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Hostname:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocol:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP over TLS/SSL (explicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP over TLS/SSL (implicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP over SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Site label:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Remote directory:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Local directory:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, fuzzy, no-c-format
+msgid "&Anonymous login"
+msgstr "Anonymous login"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, fuzzy, no-c-format
+msgid "&Advanced"
+msgstr "Advanced"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, fuzzy, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Disable use of extended passive mode"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Disable use of passive mode"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, fuzzy, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "SFTP Reading directory listing..."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Multiple Transfer Threads"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Do not use multiple threads for this site"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Server Encoding"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Encoding:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, fuzzy, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Retry to connect on failure"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Retry"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Number of retries (0 = infinite):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Retry delay:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, fuzzy, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "Filter Editor"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, fuzzy, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII Extensions"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Add Extension"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Extension:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Extension"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Retrying connection..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Retrying connection..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Enter the whole url into this box"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Enter ftp's hostname"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anon&ymous login"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Check for anonymous login"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Enter account username"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Enter account password"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Add to &bookmarks"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Advanced"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Connection established."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "SFTP Reading directory listing..."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 Certificate"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Use the following SSL certificate when connecting"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Path:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, fuzzy, no-c-format
+msgid "E-mail &Address"
+msgstr "Email address:"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, fuzzy, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "Use email address from control centre"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, fuzzy, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Confirm program exit if there are active transfers"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, fuzzy, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Start the program minimised to systray"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, fuzzy, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Show splashscreen on startup"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, fuzzy, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Skip empty directories"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, fuzzy, no-c-format
+msgid "Site Defaults"
+msgstr "File Transfer Defaults"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, fuzzy, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Encrypt bookmark file"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, fuzzy, no-c-format
+msgid "&Notification"
+msgstr "Notification Options"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Show balloon when transfer completes"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, fuzzy, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Only show when queue is empty after transfer"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, fuzzy, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Show balloon when connection retry succeeds"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, fuzzy, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Source:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, fuzzy, no-c-format
+msgid "File list"
+msgstr "File Exists"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, fuzzy, no-c-format
+msgid "Failed"
+msgstr "Filter"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Show balloon when transfer completes"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Show balloon when transfer completes"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, fuzzy, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Confirm program exit if there are active transfers"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, fuzzy, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Encrypt bookmark file"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, fuzzy, no-c-format
+msgid "Default local directory."
+msgstr "Default local directory:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, fuzzy, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Skip empty directories"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, fuzzy, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Skip empty directories"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, fuzzy, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Unable to connect to the server."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, fuzzy, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Number of threads per session:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Confirm program exit if there are active transfers"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, fuzzy, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Waiting %1 seconds before reconnect..."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Root directory"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Filter"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Main Menu"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Bookmark Toolbar"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "No username specified for '%1'."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Error Connecting"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Display"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "KFTPQuickConnectLayout"
+
+#~ msgid "Webpage design"
+#~ msgstr "Webpage design"
+
+#~ msgid "Command"
+#~ msgstr "Command"
+
+#~ msgid "What's this?"
+#~ msgstr "What's this?"
+
+#~ msgid "Server Management"
+#~ msgstr "Server Management"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Site Command Dialogue"
+
+#~ msgid "Username"
+#~ msgstr "Username"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Enter a username or press cancel"
+
+#~ msgid "Group name"
+#~ msgstr "Group name"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Enter a group or press cancel"
+
+#~ msgid "Description name"
+#~ msgstr "Description name"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Enter a description or press cancel"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Passwords do not match"
+
+#~ msgid "Optional"
+#~ msgstr "Optional"
+
+#~ msgid "Password retype:"
+#~ msgstr "Password retype:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Send &Raw Command..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Display your idle time"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Set your idle-time (per-session only)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "This will change your password"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "This will change your password.<br>Passwords can only be 8 characters long."
+
+#~ msgid "Display the group info"
+#~ msgstr "Display the group info"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Display the group info<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Show current aliases"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Show current cdpaths"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Show current glftpd version"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Show current glftpd version<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Display users currently online"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Display users currently online<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Display the welcome screen"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Display the welcome screen<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Display current time on the site"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Display current time on the site<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Display recently unnuked releases"
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Display recently unnuked releases<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Delete a user, may be readded with site READD"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Change user's password"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Toggle the user's gadmin status for the given group"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Display a user's flags"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Kick a user off the site"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Remove deleted users, site READD will NOT work for purged uers."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Readd user"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Display a user's upload/download statistics"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Lists users / Shows detailed info about a user"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Shows available groups"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Shows detailed info on a group"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Add a new group"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Delete a group"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Shows your current groups or leaves/joins a group"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Change description for a group"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Display your current status line"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Display all-time downloaders"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Display alltime downloaders"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Display all-time downloaders who belong to the group"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Display all-time uploaders"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Display all-time uploaders who belong to the group"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Display daytop upload"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Display daytop uploaders who belong to the group"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Display daytop download"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Display daytop downloaders who belong to the group"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Display monthtop upload"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Display monthtop uploaders who belong to the group"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Display monthtop download"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Display monthtop downloaders who belong to the group"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Display all-time nuketop"
+
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Display alltime nuketop"
+
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Display all-time nuketop who belongs to the group"
+
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Display weektop uploaders"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Display weektop uploaders who belong to the group"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Display weektop downloaders"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Display weektop downloaders who belong to the group"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Display server traffic"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Display alltime group upload"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Display alltime group upload<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Display month group upload"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Display month group upload<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Display month group download"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Display month group download<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Display weektop group upload"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Display weektop group upload<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Display weektop group download"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Display weektop group download<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Display alltime group download"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Display alltime group download<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Load user's userfile into your process' memory, essentially becoming that user."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Display helpscreen"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Display helpscreen<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Display failed logins"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Display recently nuked releases"
+
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Display recently nuked releases<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Check when a user was last online"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Displays the userfile in raw format"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Displays the userfile in raw format<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Shows detailed information about users online"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Shows detailed information about users online<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Send Bookmarks To"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<No contacts are available>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Disabled in this version of KDE>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Send Bookmarks"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "This server is a distributed FTP daemon"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Are you sure you want to delete this file(s)?"
+
+#~ msgid "Date"
+#~ msgstr "Date"
+
+#~ msgid "Permissions"
+#~ msgstr "Permissions"
+
+#, fuzzy
+#~ msgid "Owner"
+#~ msgstr "Other"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Unable to open directory '%1'."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Displaying all might take some time."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Are you sure?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Transfer Settings"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Transfer Settings"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Add New Pattern"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Are you sure that you want to remove this pattern?"
+
+#, fuzzy
+#~ msgid "&Other"
+#~ msgstr "Other"
+
+#, fuzzy
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Rename files to lower case upon download"
+
+#, fuzzy
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Highlighting"
+
+#, fuzzy
+#~ msgid "&Add Pattern..."
+#~ msgstr "Add Pattern..."
+
+#, fuzzy
+#~ msgid "E&dit..."
+#~ msgstr "Edit..."
+
+#, fuzzy
+#~ msgid "Re&move"
+#~ msgstr "R&emove"
+
+#, fuzzy
+#~ msgid "E&nabled"
+#~ msgstr "Enabled"
+
+#, fuzzy
+#~ msgid "Priority pattern:"
+#~ msgstr "Skip pattern:"
+
+#~ msgid "Patterns"
+#~ msgstr "Patterns"
+
+#, fuzzy
+#~ msgid "&Add Pattern"
+#~ msgstr "Add Pattern"
+
+#, fuzzy
+#~ msgid "&Skip"
+#~ msgstr "Skip"
+
+#, fuzzy
+#~ msgid "Priority List Settings"
+#~ msgstr "Skip List Settings"
+
+#, fuzzy
+#~ msgid "E&nable priority list"
+#~ msgstr "Enable skip list"
+
+#, fuzzy
+#~ msgid "S&kip empty files"
+#~ msgstr "Skip empty files"
+
+#, fuzzy
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Apply skiplist to directories"
+
+#, fuzzy
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Do not queue files on skip list"
+
+#, fuzzy
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Do not queue files on skip list"
+
+#, fuzzy
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Apply skiplist to directories"
+
+#, fuzzy
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Do not queue files on skip list"
+
+#, fuzzy
+#~ msgid "Queue directories before files."
+#~ msgstr "Skip empty directories"
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "editshred"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "&Set Filter..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Clear Filter"
+
+#~ msgid "Filter"
+#~ msgstr "Filter"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Enter filter:"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "FTP Bookmark Editor"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL Settings"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Transfer mode:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - private (integrity and privacy)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - confidential (privacy without integrity)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - safe (integrity without privacy)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - clear (no SSL)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Connection failed (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Transfer:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Down: %1/s Up: %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "SFTP Reading directory listing..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "SFTP Directory changed to '%1'"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Starting with '%1' file download"
+
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr ""
+#~ "Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Starting with '%1' file upload"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "FXP transfer failed."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Protection mode setup failed, fallback to unencrypted connection."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Unknown host '%1'."
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Unable to establish implicit SSL connection."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Established implicit SSL connection."
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Directory listing complete."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Unable to connect to the server."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Disconnected from server."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "Incompatible SSL modes on source and destination server."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "There was a problem establishing the data connection."
+
+#~ msgid "Error reading file."
+#~ msgstr "Error reading file."
+
+#, fuzzy
+#~ msgid "Unable to connect with server."
+#~ msgstr "Unable to connect to the server."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Directory is not in cache."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Unable to open directory."
+
+#~ msgid "View &Local"
+#~ msgstr "View &Local"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "&Offline Mode"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "This URL is not in the cache."
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Directory is not in cache."
+
+#, fuzzy
+#~ msgid "Error to find %1 file"
+#~ msgstr "Error reading file."
+
+#~ msgid "CRC check matches - file integrity was verified."
+#~ msgstr "CRC check matches - file integrity was verified."
+
+#~ msgid "Warning: CRC check failed. Downloaded file may be corrupted."
+#~ msgstr "Warning: CRC check failed. Downloaded file may be corrupted."
+
+#, fuzzy
+#~ msgid "Boo&kmarks"
+#~ msgstr "Send Bookmarks"
+
+#~ msgid "Script & Event Editor"
+#~ msgstr "Script & Event Editor"
+
+#~ msgid "Event Name"
+#~ msgstr "Event Name"
+
+#~ msgid "No events"
+#~ msgstr "No events"
+
+#~ msgid "Script Editor"
+#~ msgstr "Script Editor"
+
+#~ msgid "This code cannot be saved, because it contains syntax errors; do you want to return to editing?"
+#~ msgstr "This code cannot be saved, because it contains syntax errors; do you want to return to editing?"
+
+#~ msgid "Syntax Error"
+#~ msgstr "Syntax Error"
+
+#~ msgid "Unknown (FXP)"
+#~ msgstr "Unknown (FXP)"
+
+#~ msgid "&Filter Editor..."
+#~ msgstr "&Filter Editor..."
+
+#~ msgid "&Script Editor..."
+#~ msgstr "&Script Editor..."
+
+#, fuzzy
+#~ msgid "&Threads"
+#~ msgstr "Threads"
+
+#~ msgid "Preferences"
+#~ msgstr "Preferences"
+
+#~ msgid "General Preferences"
+#~ msgstr "General Preferences"
+
+#~ msgid "Here you can set, how the log output will look like. You can set different output colors and you can enable log writing to a file."
+#~ msgstr "Here you can set, how the log output will look like. You can set different output colours and you can enable log writing to a file."
+
+#~ msgid "Log font:"
+#~ msgstr "Log font:"
+
+#~ msgid "UNKNOWN_FONT"
+#~ msgstr "UNKNOWN_FONT"
+
+#~ msgid "Here you can change various display options that affect current file view."
+#~ msgstr "Here you can change various display options that affect current file view."
+
+#~ msgid "File View"
+#~ msgstr "File View"
+
+#~ msgid "Show tree view"
+#~ msgstr "Show tree view"
+
+#~ msgid "Show filesize in bytes"
+#~ msgstr "Show filesize in bytes"
+
+#~ msgid "Here you can set some general setting for KFTPGrabber."
+#~ msgstr "Here you can set some general setting for KFTPGrabber."
+
+#~ msgid "<i>If you select this option, you will not be able to access your bookmarks without a valid key. You will be prompted to set the key, when you exit the application.</i>"
+#~ msgstr "<i>If you select this option, you will not be able to access your bookmarks without a valid key. You will be prompted to set the key, when you exit the application.</i>"
+
+#~ msgid "Here you can set some options that will affect how transfer connections are established and some defaults about queuing transfers."
+#~ msgstr "Here you can set some options that will affect how transfer connections are established and some defaults about queuing transfers."
+
+#~ msgid "IP address/hostname:"
+#~ msgstr "IP address/hostname:"
+
+#~ msgid "<i>(If you have a dynamic IP you can put a hostname that points to your IP and it will be automatically resolved.)</i>"
+#~ msgstr "<i>(If you have a dynamic IP you can put a hostname that points to your IP and it will be automatically resolved.)</i>"
+
+#~ msgid "Queue files when dropped via \"Drag && Drop\""
+#~ msgstr "Queue files when dropped via \"Drag && Drop\""
+
+#~ msgid "Email Address to Use as Password on Anonymous Servers"
+#~ msgstr "Email Address to Use as Password on Anonymous Servers"
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/kftpgrabber.po b/translations/es/messages/kftpgrabber.po
new file mode 100644
index 0000000..1b0c610
--- /dev/null
+++ b/translations/es/messages/kftpgrabber.po
@@ -0,0 +1,2997 @@
+# Translation of kftpgrabber to Castilian aka Spanish
+# This file is distributed under the same license as the KFTPGrabber package
+# Copyright (C) 2004 Jernej Kos <kostko@jweb-network.net>, Markus Brueffer <markus@brueffer.de>
+#
+# Edgardo Rossetto <eros@speedy.com.ar>, 2004.
+# Enrique Matias Sanchez (aka Quique) <cronopios@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-12-10 23:08+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "contiene"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "no contiene"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "es igual a"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "es diferente de"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "coincide con la expresión regular"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "no coincide con la expresión regular"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "es"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "no es"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Directorio"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "es mayor que"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "es menor que"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "bytes"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Por favor, seleccione una acción."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Prioridad:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Descargar"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Enviar"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+"Etiqueta desconocida al analizar las órdenes personalizadas para el sitio."
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>La operación solicitada ha fallado. La respuesta del servidor es:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>No se puede encontrar el manejador llamado <b>%1</b> "
+"para analizar la respuesta.</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Nombre del fichero"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Tipo de entrada"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Tamaño"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Cambiar la prioridad"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Omitir al poner en espera"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Colorear en la vista de lista"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Ocultar de la vista de lista"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Destino en minúsculas"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Regla sin nombre"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Importar de gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Importar de KFTP Grabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Importar de NcFTP"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "Importación de FileZilla 3"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Han finalizado todas las transferencias encoladas."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "El fichero existe"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - un cliente de FTP para KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Un URL opcional al que conectarse"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Desarrollador principal"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Desarrollador"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Código de LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Código de optCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Código de aviso KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Elemento de gráfico de tráfico"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Diseño de los iconos"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Pruebas y depuración"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Código del analizador de directorios"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Código de manejo de la columna de la vista de lista"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Ha finalizado la transferencia de los siguientes ficheros:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "La conexión al servidor ha fallado."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "El ingreso en el servidor ha fallado"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "No se puede encontrar el fichero de origen."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Se ha denegado el permiso."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "No se ha podido escribir en el fichero."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "La transferencia falló por alguna razón."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"La transferencia de los siguientes ficheros <b>ha sido interrumpida</b> "
+"debido a que no hay suficiente espacio libre en «%1»:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "No se puede establecer la conexión SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Ingresando..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Conectado al servidor, intentando ingresar..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "El ingreso ha fallado."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "La autenticación interactiva con el teclado ha tenido éxito."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "La autenticación con clave pública ha tenido éxito."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "No se ha podido inicializar el canal de SFTP."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "No se ha podido inicializar SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Conectado."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Conectando..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Conectándose a %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Interrumpido."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Usando listado del directorio en caché."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Obteniendo el listado del directorio..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Transfiriendo..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Descargando el fichero «%1»..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Enviando el fichero «%1»..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Eliminando..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Renombrando..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Cambiando el modo..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "La conexión ha fallado."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"La negociación de SSL ha tenido éxito. La conexión está protegida con un "
+"cifrado %2 de %1 bits."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "La negociación SSL ha fallado. El ingreso ha sido interrumpido."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+"La petición de negociación SSL ha fallado. El ingreso ha sido interrumpido."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "La negociación SSL ha fallado. La conexión ha sido interrumpida."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Conectado al servidor, esperando el mensaje de bienvenida..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "No es posible establecer la conexión (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Familia de direcciones incompatible para el PUERTO, pero no se admite EPRT, "
+"interrumpiendo."
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Estableciendo conexión de datos con %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "No ha sido posible establecer un 'socket' de escucha."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Esperando la conexión de datos en el puerto %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "La conexión de datos ha sido establecida."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "El canal de datos está protegido con SSL de %1 bits."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"La negociación SSL para el canal de datos ha fallado. Interrumpiendo la "
+"transferencia."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Transferencia finalizada."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Creando el directorio..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Ninguno de los servidores reconoce SSCN/CPSV, pero se ha solicitado una "
+"conexión de datos SSL; se interrumpe la transferencia."
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Enviando el fichero «%1»..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Transmitiendo la señal de vida..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Desconectado."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "La conexión ha expirado."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Ocioso."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Exploración finalizada."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Iniciando una exploración recurrente del directorio..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Esperando %1 segundos antes de conectarse de nuevo..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Esperando..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Reintentando la conexión (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Reintentando la conexión..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Reintento interrumpido."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Acciones en caso de que el fichero exista (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Tamaño/Marca temporal"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Mismo"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Más antiguo"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Más reciente"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Más pequeño"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Más grande"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Omitir"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Sobreescribir"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Reanudar"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Renombrar"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Preguntar"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Registro (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Sesión local"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Registro"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "La conexión a %1 ha sido establecida con éxito."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Por favor, indique la contraseña para descifrar su clave privada."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sesión"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Debe permanecer abierta al menos una sesión en cada lado."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Finalice todas las transferencias antes de cerrar la sesión."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Esta sesión está actualmente conectada. ¿Seguro que desea desconectarse?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Cerrar la sesión"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "&Conexión rápida..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nueva sesión"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Lado izquierdo"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Lado de&recho"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Modo de &transferencia (Auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binario"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Modo de &transferencia (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Modo de &transferencia (Binario)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Seleccionar..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Sin nombre"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Transferencia"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Descripción"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "No hay ninguna transferencia fallida."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Reiniciar la transferencia"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Añadir a la cola"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Añadir todo a la cola"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Eliminar"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Eliminar todo"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "¿Seguro que desea eliminar esta transferencia fallida?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "¿Seguro que desea eliminar TODAS las transferencias fallidas?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nuevo patrón"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Patrón del nombre de fichero:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Color:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Conexión rápida"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "¿Desea limpiar la lista de los servidores accedidos recientemente?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "un nombre de máquina"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "un puerto válido"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "su nombre de usuario"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "su contraseña"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " y"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Por favor, introduzca "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+"Por favor, proporcione la contraseña de descifrado de su certificado X509."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Sitios cerca de usted"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "No hay ningún sitio publicado."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Patrón"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Color"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Añadir un patrón"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Habilitado"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Realce"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>No implementado todavía.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Omitir la lista"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Extensiones ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "General"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Transferencias"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Visualización"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Acciones"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtros"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Verificación de la integridad"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Suma de verificación"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verificación finalizada."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"No se ha podido abrir el fichero de la suma de verificación, o el fichero tiene "
+"un formato incorrecto."
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filtro &habilitado"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Sin filtros."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Subir"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Bajar"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Renombrar..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Nuevo"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Renombrar la regla"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Renombrar la regla «%1» a:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Condiciones"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Coincidir con tod&as las siguientes"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Coincidir con cu&alquiera de las siguientes"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Buscar y reemplazar"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Uso del ancho de banda"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Más"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Menos"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Limpiar"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "detenido"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "en ejecución"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "A la espera de conexión..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtro: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nombre"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Fuente"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Destino"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Progreso"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Velocidad"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "Tiempo estimado"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "No tiene ningún fichero en la cola."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Bajar"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "Subir"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Hebras"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Iniciar la tran&sferencia"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Interrumpir la tr&ansferencia"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Elimin&ar todo"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "S&ubir"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "&Descender"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Subir arriba del &todo"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Bajar a&bajo del todo"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Cambiar la información de transferencia"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Cargar la co&la desde un fichero"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Guardar la cola en un fichero"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Iniciar"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pausar"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Añadir una transferencia..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "Bu&scar y reemplazar..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Mostrar el &filtro"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Sitio"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "¿Seguro que desea eliminar los ficheros encolados?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "¿Seguro que desea eliminar TODOS los ficheros encolados?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"La carga de una nueva cola sobreescribirá la actual; ¿seguro que desea "
+"continuar?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Cargar la cola"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Sesión del sitio [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Hebra %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "ocioso"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "desconectado"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "conectando"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "transfiriendo"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Estado"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "En este momento no hay ninguna hebra en ejecución."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Sin marcadores."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nuevo..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Renombrar"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Crear una subcategoría..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplicar"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+"Proporcione su nombre de usuario y contraseña para conectarse a este sitio."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Sitio:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Nombre de la categoría"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Renombrar la categoría:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nuevo nombre de la categoría"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nueva categoría:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Nuevo servidor"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Nuevo servidor"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "¿Seguro que desea eliminar esta categoría?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "¿Seguro que desea eliminar este servidor?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "No ha sido posible cargar el complemento de importación seleccionado."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "El fichero seleccionado no existe o no se puede leer."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "La importación de marcadores ha finalizado."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Editar..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Opciones de SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importar..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exportar..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Editor de marcadores de FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Se dispone a exportar sus marcadores de KFTPGrabber. Éstos podrían contener "
+"contraseñas o certificados X509 sensibles; la exportación de los marcadores "
+"podría comprometer su seguridad."
+"<br>"
+"<br>¿Está seguro?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Exportar los marcadores"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Interrumpir"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Mo&strar la vista de árbol"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Propiedades"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "De&struir"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Opciones del &filtro"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "&Siempre omitir este fichero al encolar"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Dar &máxima prioridad a este fichero"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Dar &la mínima prioridad a este fichero"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Transferencia"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Encolar la transferencia"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Crear un directorio..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Abrir un fichero"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verificar..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Más acciones"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "Introducción &manual de órdenes..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Exportar el listado del directorio..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Mostrar los ficheros y directorios &ocultos"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Abrir el directorio actual en &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Comparar los elementos &seleccionados"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Comparar los &directorios"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Enviar una orden en b&ruto"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Cambiar el sitio"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Conexión rápida..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Conectarse a"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Desconectar"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Cambiar la &codificación remota"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "¿Desea abandonar la conexión actual?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "¿Seguro que desea DESTRUIR este fichero?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Destruir el fichero"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"¿Desea realmente borrar este elemento?\n"
+"¿Realmente desea borrar estos %n elementos?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Borrar los ficheros"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Omitir «%1»"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Prioridad «%1»"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Crear un directorio"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Nombre del directorio:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Enviar una orden en bruto"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Orden:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Exportar el listado del directorio"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Se han ocultado los ficheros idénticos en ambos lados. Ahora sólo son visibles "
+"los <b>ficheros diferentes</b>."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&General"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Carpeta remota"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tipo:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Ubicación:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Tamaño:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Creado:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Permisos"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Permisos de acceso"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Clase"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Mostrar las\n"
+"entradas"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Leer"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Escribir las\n"
+"entradas"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Escribir"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Entrar"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Ejecutar"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Especial"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Usuario"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupo"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Otros"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Establecer el UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Establecer el GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Pegajoso"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Aplicar los cambios a todas las subcarpetas y a su contenido"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Directorio raíz"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Ruta: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Ésta es una conexión cifrada con SSH. Actualmente no hay disponible información "
+"sobre el certificado."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Opciones del filtro"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Directorios del filtro"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Enlaces simbólicos del filtro"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Diferencias mayúsculas y minúsculas"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "Se ha inicializado el registro de <b>KFTPGrabber</b>.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "No se ha podido escribir en el fichero."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>No se ha podido encontrar el fichero XML descriptor de la GUI %1. Por "
+"favor, verifique que ha instalado la aplicación correctamente. Si tiene alguna "
+"duda, pregunte a %2."
+"<br>"
+"<br><b>Advertencia:</b>La GUI actual estará incompleta.</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Si cierra la ventana principal, KFTPGrabber seguirá ejecutándose en la "
+"bandeja del sistema. Use la opción <b>Salir</b> del menú <b>KFTPGrabber</b> "
+"para salir de la aplicación.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Anclaje en la bandeja del sistema"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Actualmente hay una transferencia en curso.\n"
+"Actualmente hay %n transferencias en curso."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"¿Seguro que desea salir?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Sitios FTP cerca de mí"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Sitios de KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Editar los marcadores..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Descarga: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Envío: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Cola"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Transferencias fallidas"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Sitios cerca de mí"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Hebras"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Tráfico"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Copia de"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"El fichero de marcadores está cifrado. Introduzca la clave para descrifrarlo."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>No se ha podido descifrar el fichero de marcadores con la clave "
+"proporcionada. ¿Desea <b>sobreescribir</b> los marcadores con un fichero vacío?"
+"<br>"
+"<br><font color=\"red\"><b>Atención:</b>Si sobreescribe, se perderán todos los "
+"marcadores actuales.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "El descifrado ha fallado"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "S&obreescribir los marcadores"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Introduzca la clave para cifrar el fichero de marcadores."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Ningún servicio publicado>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD no disponible>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Ningún sitio en KWallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Edgardo Rossetto,Enrique Matías Sánchez (Quique)"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "eros@speedy.com.ar,cronopios@gmail.com"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Visualización"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Gestor de ficheros"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Mostrar los fic&heros y directorios ocultos"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Mostrar el árbol de &directorios"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Mostrar el &tamaño de los ficheros en bytes (conmuta con el formato «legible»)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Mostrar el pr&opietario y grupo de cada fichero"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Mo&strar el tamaño del directorio"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "&Otros elementos de la interfaz"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Mostrar la barra lateral izquierda"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Buscar y reemplazar en la cola"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Usando esta ventana, puede efectuar reemplazos globales sobre las rutas de "
+"origen y destino de la cola de transferencias. <b>Los cambios no se pueden "
+"deshacer.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Qué buscar"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destino:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Fuente:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Buscar solamente las transferencias sobre un servidor específico"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Información del servidor"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Nombre del servidor:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Máquina:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Contraseña:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Nombre de usuario:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Puerto:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Reemplazar por"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Asistente de importación de marcadores"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Paso 1: <b>Seleccione el complemento de importación</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Imagen"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Por favor, seleccione el complemento de importación adecuado de la lista "
+"inferior. Cada complemento puede importar de un formato diferente."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Complementos de importación disponibles:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Paso 2: <b>Seleccione el fichero de marcadores a importar</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Por favor, seleccione el fichero de marcadores desde el que desea importar sus "
+"marcadores. El complemento de importación ya ha determinado una ruta por "
+"omisión."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Ruta de los marcadores:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Paso 3: <p>Importando los marcadores...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Por favor, espere mientras se importan los marcadores."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Progreso de la importación:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Apariencia"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Tipo de letra y colores"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Tipo de letra:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Color de las órdenes del cliente:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Color de las respuestas del servidor:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Color de las respuestas de varias líneas:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Color de los mensajes de error:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Color de los mensajes de estado:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Salida"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Guardar la salida en un &fichero"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Guardar el registro en un fichero"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Fichero de salida:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Información del servidor fuente"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Información del servidor de destino"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Fuente:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Destino:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Tipo de transferencia:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Co&nexión"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP de la conexión activa"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Forzar PORT/EPRT para &usar la IP configurada"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/Nombre de la máquina:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "&Ignorar la IP externa en las conexiones de red local"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Intervalo de puertos de las conexiones activas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "&Usar solamente los puertos del intervalo indicado"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Puerto mínimo:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Puerto máximo:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Tiempos límite"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Tiempo límite de la conexión de control (en segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Tiempo límite de la transferencia de datos (en segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Velocidad límite"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Descarga (kB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Envío (kB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Espacio en &disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Comprobación del espacio libre en disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Detener la transferencia si &no hay suficiente espacio libre"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervalo (segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Espacio libre mínimo (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Hebr&as"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Número de hebras por sesión:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Usar la conexión primaria para las transferencias"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Varios"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Reintentar automáticamente las conexiones fallidas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Número máximo de reintentos antes de marcar como fallida:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Otros"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"&Encolar los ficheros (en vez de transferirlos) tras un «arrastrar y soltar»"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Omitir los directorios vacíos al poner en &espera"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Confirmar las desconexiones &antes de efectuarlas"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Nombre de la máquina:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocolo:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP sobre TLS/SSL (explícito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP sobre TLS/SSL (implícito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP sobre SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Etiqueta del sitio:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Directorio remoto:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Directorio local:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "Ingreso &anónimo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Avanzado"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Desha&bilitar el uso del modo pasivo extendido"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Deshabilitar el uso del modo pasivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Usar la IP del sitio para las conexiones en modo pasivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr "Deshabilitar «forzar el modo activo para usar esta IP» para este sitio"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Utilizar la orden STAT para listar los directorios"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Varias hebras de transferencia"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "No usar varias hebras para este sitio"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Codificación del servidor"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Codificación:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Reintentar y &mantener con vida"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "&Reintentar la conexión en caso de fallo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Reintentar"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Número de reintentos (0 = ilimitado):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Demora entre cada reintento:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Usar paquetes de señales de vida para mantener la conexión abierta"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Señal de vida"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Frecuencia de las señales de vida (segundos):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "E&xtensiones ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Añadir una extensión"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Extensión:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Extensión"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Conexiones recientes"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Seleccione la conexión:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Introduzca el URL completo en esta caja"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Introduzca el nombre de la máquina FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Ingreso &anónimo"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Comprobar el ingreso anónimo"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Introduzca el usuario de la cuenta"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Introduzca la contraseña de la cuenta"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Añadir a los &marcadores"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avanzado"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Opciones de la conexión de datos"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Modo:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Siempre cifrar el canal de datos"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Cifrar solamente los listados de los directorios"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "No cifrar el canal de datos"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Certificado X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Usar el siguiente certificado SSL para conectarse"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Ruta:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "&Dirección de correo electrónico"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Usar la dirección de correo electrónico del centro de control"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Correo electrónico:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Inicio y salida"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Confirmar la &salida del programa si hay transferencias activas"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Iniciar el programa minimi&zado en la bandeja del sistema"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Mostrar la pantalla de pre&sentación en el inicio"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Mostrar el icono en la bandeja del &sistema"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Sal&ir por omisión al pulsar el botón X"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Opciones predefinidas para el sitio"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "&Cifrar el fichero de marcadores"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Mo&strar los sitios de KWallet entre los marcadores"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Notificación"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Globos"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Mo&strar un globo cuando finalice la transferencia"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Mostrar solamente si la &cola se queda vacía tras la transferencia"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Mostrar un globo cuando el &reintento de conexión tenga éxito"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Fichero:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "ninguno"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Lista de ficheros"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "No procesado"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Aceptar"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "No encontrado"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Fallido"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "El tamaño de la ventana principal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "La posición en pantalla de la ventana principal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "El número predefinido de reintentos para sitios nuevos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "El tiempo predefinido entre reintentos de conexión para sitios nuevos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Se debe mostrar un globo cuando finalicen algunas acciones."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Se debe mostrar un globo cuando finalicen todas las transferencias de la cola."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Se debe mostrar un globo cuando se establezca con éxito una conexión al "
+"servidor tras reintentarlo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "El usuario debe confirmar la salida si hay transferencias en curso."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Estado de cifrado del fichero de marcadores."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Directorio local predefinido."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Si la aplicación debe salir cuando el usuario pulse el botón X."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "La aplicación debe iniciarse minimizada."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Se debe mostrar la pantalla de presentación al iniciar la aplicación."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Se debe mostrar el icono en la bandeja del sistema."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Se debe mostrar los sitios de KWallet entre los marcadores."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Se debe mostrar una ventana de confirmación de la desconexión cada vez que se "
+"solicite una desconexión."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "La codificación predefinida del sitio."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+"Sitios a los que se ha accedido recientemente mediante conexión rápida."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Una lista de patrones de ficheros para los que se debe usar el modo ASCII en "
+"las transferencias."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Se deben omitir los directorios vacíos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "El tipo de letra a usar en la ventana de registro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "El color de las órdenes enviadas al servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "El color de las respuestas del servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "El color de las respuestas de varias líneas del servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "El color de los mensajes de error."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "El color de los mensajes de estado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Se debe escribir el registro también en un fichero."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "El fichero en el que se debe escribir el registro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Se debe seleccionar un puerto de un intervalo concreto para las transferencias "
+"activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "El comienzo del intervalo de puertos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "El final del intervalo de puertos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Se debe ignorar una IP al hacer transferencias activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "IP a enviar en caso de hacer caso omiso de la orden PORT."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Si se debe ignorar la IP externa en las conexiones de red local."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Se debe encolar las transferencias en vez de iniciarlas cuando se use arrastrar "
+"y soltar."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"KFTPGrabber debe comprobar si hay espacio libre e interrumpir la transferencia "
+"si no hay suficiente espacio libre."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Intervalo de verificación del disco."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Espacio libre mínimo (en MiB) que debe haber disponible."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"Utilizar la dirección de correo electrónico global de KDE para las contraseñas "
+"anónimas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+"La dirección de correo electrónico que se debe usar para las contraseñas "
+"anónimas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Número de hebras a usar al transferir."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Si se debe usar la conexión primaria para las transferencias."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tiempo límite (en segundos) para la conexión de control."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tiempo límite (en segundos) para las transferencias de datos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Límite de velocidad de descarga global (kB/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Límite de velocidad de envío global (kB/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Si se debe reintentar automáticamente las transferencias fallidas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"Número máximo de reintentos antes de marcar la transferencia como fallida."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "De debe mostrar por omisión el árbol de directorios."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Se deben mostrar los ficheros ocultos al navegar."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Se debe mostrar el tamaño de los ficheros en bytes en vez de en forma "
+"«legible»."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Se debe mostrar el usuario y grupo de cada fichero."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Mostrar el tamaño del directorio."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Mostrar la barra lateral izquierda."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Menú principal"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barra de marcadores"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "No se ha indicado ningún nombre de usuario para «%1»."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Error al conectarse"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "DisplaySettings"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "KFTPQuickConnectLayout"
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/kftpgrabber.po b/translations/et/messages/kftpgrabber.po
new file mode 100644
index 0000000..94bdbad
--- /dev/null
+++ b/translations/et/messages/kftpgrabber.po
@@ -0,0 +1,3488 @@
+# translation of kftpgrabber.po to Estonian
+# Marek Laane <bald@starman.ee>, 2005-2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-12-11 20:00+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.10.1\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "sisaldab"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "ei sisalda"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "võrdub"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "ei võrdu"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "vastab regulaaravaldisele"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "ei vasta regulaaravaldisele"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "on"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "ei ole"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Kataloog"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "on suurem kui"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "on väiksem kui"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "baiti"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Palun vali toiming."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Prioriteet:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Allalaadimine"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Üleslaadimine"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Tundmatu silt kohandatud saidi käskude parsimisel!"
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Soovitud operatsioon ebaõnnestus! Server vastas:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr "<qt>Vastuse parsimiseks ei leitud käsitlejat nimega <b>%1</b>!</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Failinimi"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Kirje tüüp"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Suurus"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Muuda prioriteeti"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Jäta järjekorda pannes vahele"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Värvi loendivaates"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Peida loendivaates"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Väiksetäheline sihtkoht"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Nimetu reegel"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP import"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabberi import"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp import"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla 3 import"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Kõik järjekorras olnud ülekanded lõpetatud."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Fail on olemas"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - KDE FTP-klient"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "URL ühendumiseks (pole kohustuslik)"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Põhiarendaja"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Arendaja"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH kood"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc kood"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBallooni kood"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Liikluse graafiku vidin"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Ikooni kujundus"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Testimine ja silumine"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Kataloogiparseri kood"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Loendivaate veeru käsitlemise kood"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Järgmiste failide ülekanne lõpetatud:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Ühendumine serveriga ebaõnnestus."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Sisselogimine serverisse ebaõnnestus"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Allikfaili ei leitud."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Õigusi ei tunnistatud."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Faili avamine kirjutamiseks ebaõnnestus."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Ülekanne ebaõnnestus mingil põhjusel."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Järgmiste failide ülekandest <b>loobuti</b>, sest '%1' on ruuminappuses:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "SSH ühenduse (%1) loomine ebaõnnestus"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Sisselogimine..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Ühendus serveriga loodud, püütakse sisse logida..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Sisselogimine ebaõnnestus."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Autentimine klaviatuurilt õnnestus."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Autentimine avaliku võtmega õnnestus."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "SFTP kanali initsialiseerimine ebaõnnestus."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "SFTP initsialiseerimine ebaõnnestus."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Ühendatud"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Ühendumine..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Ühendumine masinaga %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Katkestatud."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Kasutatakse puhverdatud kataloogide nimekirja."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Kataloogi nimekirja tõmbamine..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Ülekanne..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Faili '%1' allalaadimine..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Faili '%1' üleslaadimine..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Eemaldamine..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Ümbernimetamine..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Režiimi muutmine..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Ühendumine ebaõnnestus."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr "SSL läbirääkimised õnnestusid. Ühendust turvab %1-bitine šiffer %2."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL läbirääkimised ebaõnnestusid. Sisselogimine katkestati."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL läbirääkimiste soov ebaõnnestus. Sisselogimine katkestati."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL läbirääkimised ebaõnnestusid. Ühendus katkestati."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Ühendus serveriga loodud, oodatakse tervitusteadet..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Ühendumine ebaõnnestus (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr "Sobimatu aadressipere PORT'ile, kuid EPRT pole toetatud, loobutakse!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Andmeühenduse loomine masinaga %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Jälgimissokli loomine ebaõnnestus."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Andmeühenduse ootamine pordis %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Andmeühendus loodud."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Andmekanalit turvab %1-bitine SSL."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"SSL läbirääkimised andmekanali osas ebaõnnestusid. Ülekanne katkestatakse."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Ülekanne lõpetatud."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Kataloogi loomine..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Kumbki server ei toeta SSCN/CPSV, kuid vajalik on SSL-andmeühendus, ülekanne "
+"katkestatakse!"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Faili '%1' ülekanne..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Elushoidmise ülekanne..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Lahutatud."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Ühendus aegus."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Jõude."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Uurimine lõpetatud."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Kataloogi rekursiivse uurimise alustamine..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Oodatakse %1 sekundit enne taasühendumist..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Ootamine..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Ühenduse uuestiproovimine (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Ühenduse uuestiproovimine..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Uuestiproovimisest loobuti."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Failiga ettevõetavad toimingud (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Suurus/ajatempel"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Sama"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Vanem"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Uuem"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Väiksem"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Suurem"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Jäetakse vahele"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Kirjutatakse üle"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Jätkatakse"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Nimetatakse ümber"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Küsitakse"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Logi (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Kohalik Seanss"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Logi"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Ühendus %1-ga edukalt loodud."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Palun anna oma privaatvõtme lahtikrüptimise parool."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Seanss"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Mõlemal pool peab olema avatud vähemalt üks seanss."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Palun lõpeta enne seansi sulgemist kõik ülekanded."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "Seanss on praegu ühendatud. Kas tõesti see lahutada?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Sulge seanss"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "&Kiirühendus..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Uus seanss"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "Vasaku&l"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Pa&remal"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Ülekan&derežiim (automaatne)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binaar"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Automaatne"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Ülekan&derežiim (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Ülekan&derežiim (binaar)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Vali..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Nimi puudub"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Ülekanne"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Ebaõnnestunud ülekandeid pole."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Taaskäivita ülekanne"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "Lis&a järjekorda"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Lisa kõik järjekorda"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Eemalda"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Eemalda kõik"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Kas tõesti eemaldada see ebaõnnestunud ülekanne?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Kas tõesti eemaldada KÕIK ebaõnnestunud ülekanded?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Uus muster"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Failinime muster:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Värv:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Kiirühendus"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Kas puhastada viimati kasutatud saitide loend?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "masinanimi"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "sinu kasutajanimi"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "sinu parool"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " ja"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Palun kirjuta "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Palun anna oma X509 sertifikaadi lahtikrüptimise parool."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Saidid sinu lähedal"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Ühtegi saiti pole avaldatud."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Muster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Värv"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Lisa muster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Lubatud"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Esiletõstmine"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Pole veel teostatud.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Vahelejätmiste nimekiri"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII laiendused"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Üldine"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Ülekanded"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Kuva"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Toimingud"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtrid"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Kontrollsumma kontrollija"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Kontrollsumma"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Kontrollimine lõpetatud."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Kontrollsumma faili avamine ebaõnnestus või oli see vigases vormingus."
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filt&er lubatud"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Filter puudub."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Üles"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Alla"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Nimeta ümber..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Uus"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Reegli ümbernimetamine"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Reeglile '%1' antakse nimeks:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Tingimused"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Sobiv&ad kõik järgnevad"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "So&bib üks järgnevatest"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Otsimine ja asendamine"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Ribalaiuse kasutus"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Rohkem"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Vähem"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Puhasta"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "seiskunud"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "töötab"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Ühenduse ootamine..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nimi"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Allikas"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Sihtkoht"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Edenemine"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Kiirus"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "Aega jäänud"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Järjekorras pole ühtegi faili."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Alla"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "Üles"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Lõimed"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Alu&sta ülekannet"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "K&atkesta ülekanne"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Eem&alda kõik"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Liiguta ü&les"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Lii&guta alla"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Liiguta &kõige üles"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Liiguta kõi&ge alla"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Muuda ülekande in&fot"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Laadi &järjekord failist"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Salvesta järjekord faili"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "Alus&ta"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Paus"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Lis&a ülekanne..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "Ot&si ja asenda..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Näita &filtrit"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Sait"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Kas tõesti eemaldada järjekorras olevad failid?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Kas tõesti eemaldada KÕIK järjekorras olevad failid?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr "Uue järjekorra laadimine kirjutab praeguse üle. Kas kindlasti jätkata?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Järjekorra laadimine"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Saidi seanss [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Lõim %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "jõude"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "lahutatud"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "ühendumine"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "ülekanne"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Olek"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Pole ühtegi hetkel töötavat lõime."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Järjehoidjaid pole."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Uus..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Nimeta ümber"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "Loo alam&kategooria..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "K&looni"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr "Palun anna selle saidiga ühendumiseks kasutajanimi ja parool."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Sait:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Kategooria nimi"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Kategooria ümbernimetamine:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Uus kategooria nimi"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Uus kategooria:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Uus server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Uus server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Kas tõesti see kategooria eemaldada?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Kas tõesti see server eemaldada?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Valitud impordiplugina laadimine ebaõnnestus."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Valitud faili pole olemas või ei ole see loetav."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Järjehoidjate import lõpetatud."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Muuda..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS seadistused"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Impordi..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Ekspordi..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP järjehoidjate redaktor"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Kavatsed eksportida oma KFTPGrabberi järjehoidjad. Need võivad sisaldada "
+"paroole või X509 sertifikaate, mistõttu järjehoidjate eksport sisaldab "
+"turvariski."
+"<br>"
+"<br>Kas kindlasti jätkata?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Järjehoidjate eksport"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "K&atkesta"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Näita puuvaadet"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Omadused"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Hävita"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "&Filtri valikud"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Järjekorda &seadmisel jäetakse see fail alati vahele"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Sellele failile an&takse kõrgeim prioriteet"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Se&llele failile antakse väikseim prioriteet"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Üle&kanne"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Pane ülekanne järjekorda"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Loo kataloog..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Ava fail"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "Ko&ntrolli..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "Veel toimin&guid"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "Käsi&tsi käsukirje..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Ekspordi kataloogi nimekiri..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Näita pei&detud faile ja katalooge"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Ava a&ktiivne kataloog Konqueroris..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "&Võrdle valitud elemente"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Võr&dle katalooge"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Saada too&rkäsk"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "M&uuda saiti"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Kiirü&hendus..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "Üh&endus"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Katkesta ühendus"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Muuda võrgusaidi kod&eeringut"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Kas katkestada praegune ühendus?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Kas tõesti HÄVITADA see fail?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Faili hävitamine"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Kas tõesti kustutada see element?\n"
+"Kas tõesti kustutada need %n elementi?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Failide kustutamine"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "'%1' Jäetakse vahele"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Prioriteet '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Kataloogi loomine"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Kataloogi nimi:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Toorkäsu saatmine"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Käsk:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Kataloogi nimekirja eksport"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Ühesugused failid mõlemal poolel on peidetud. Näha on nüüd ainult <b>"
+"erinevad failid</b>."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "Ü&ldine"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Võrgukataloog"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Tundmatu"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tüüp:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Asukoht:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Suurus:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Loodud:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "Õi&gused"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Ligipääsuõigused"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klass"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Kirjete\n"
+"näitamine"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Lugemine"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Kirjete\n"
+"kirjutamine"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Kirjutamine"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Sisenemine"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Käivitamine"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Spetsiaalne"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Kasutaja"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupp"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Teised"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "SUID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "SGID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Kleepuv"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Muudatuste rakendamine kõigile alamkataloogidele ja nende sisule"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Juurkataloog"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Asukoht: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr "See on SSH krüptitud ühendus. Sertifikaadiinfot pole praegu saadaval."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Filtri valikud"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Filtri kataloogid"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Filtri viidad"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Tõstutundlik"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> logimine initsialiseeritud.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Faili avamine kirjutamiseks ebaõnnestus."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>%1 XML GUI kirjeldusfaili leidmine ebaõnnestus. Kontrolli, et rakendus on "
+"korrektselt paigaldatud. Küsimuste korral esita need siin: %2."
+"<br>"
+"<br><b>Hoiatus:</b> praegune GUI on ebatäielik!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Peaakna sulgemine jätab KFTPGrabberi tööle süsteemses salves. Kasuta "
+"rakendusest väljumiseks <b>KFTPGrabberi</b> menüükäsku <b>Välju</b>.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Dokkimine süsteemsesse salve"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Praegu käib ülekanne.\n"
+"Praegu käib %n ülekannet."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Oled sa kindel, et soovid väljuda?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP-saidid minu lähedal"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "KWalleti saidid"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Muuda järjehoidjaid..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Allalaadimine: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Üleslaadimine: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Tööjärjekord"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Ebaõnnestunud ülekanded"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Saidid minu lähedal"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Lõimed"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Liiklus"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Koopia: "
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "See järjehoidjafail on krüptitud. Palun anna lahtikrüptimiseks võti."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Järjehoidjafaili lahtikrüptimine antud võtmega ebaõnnestus. Kas soovid "
+"järjehoidjad <b>üle kirjutada</b> tühja failiga?"
+"<br>"
+"<br><font color=\"red\"><b>Hoiatus:</b> ülekirjutamise korral lähevad kaotsi "
+"kõik praegused järjehoidjad.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Lahtikrüptimine ebaõnnestus"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "Kirjuta järjeh&oidjad üle"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Järjehoidjafaili krüptimise võti."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Ühtegi teenust pole avaldatud>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD pole saadaval>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<KWalletis pole ühtegi saiti>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "K&uva"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Failisir&vija"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Pei&detud failide ja kataloogide näitamine"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Kataloo&gipuu näitamine"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Failisuuruse näitamine &baitides (lülitumine \"inimlikule\" vormingule)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Iga faili &omaniku ja grupi näitamine"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Kataloogi &suuruse näitamine"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "T&eised liidese elemendid"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Vasaku külgriba näitamine"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Järjekorra otsimine ja asendamine"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Selle dialoogi abil saab järjekorras olevate ülekannete lähte- ja sihtkohti ka "
+"hulgi muuta. <b>Tehtud muudatusi ei saa tagasi võtta.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Otsimine"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Sihtkoht:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Lähtekoht:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Ülekannete otsimine ainult määratud serveris"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Serveri info"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Serveri nimi:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Masin:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Parool:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Kasutajanimi:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Asendamine"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Järjehoidjate importimise nõustaja"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "1. samm: <b>impordiplugina valik</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Pilt"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Palun vali allolevast nimekirjast vajalik impordiplugin. Iga plugin impordib "
+"erinevast failivormingust."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Saadaolevad impordipluginad:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "2. samm: <b>imporditava järjehoidjafaili valik</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Palun vali järjehoidjafail, mida soovid importida. Impordiplugin on juba ette "
+"määranud vaikimisi asukoha, aga seda võib muuta."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Järjehoidja asukoht:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "3. samm: <b>järjehoidjate import...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Palun oota, kuni järjehoidjad imporditakse."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Impordi edenemine:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Välimus"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Fondid ja värvid"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Font:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Kliendi käsu värv:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Serveri vastuse värv:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Mitmerealise vastuse värv:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Veateate värv:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Olekusõnumi värv:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "Välju&nd"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&Failiväljund"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Logi &salvestatakse failina"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Väljundfail:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Lähteserveri info"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Sihtserveri info"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Lähtekoht:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Sihtkoht:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Ülekande tüüp:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Ühe&ndus"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "Aktiivse ühenduse IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "PORT/EPRT &peab kasutama seadistatud IP-d"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/masinanimi: "
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "Väl&ist IP-d eiratakse kohtvõrgu ühenduse korral"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Aktiivse ühenduse portide vahemik"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "A&inult määratud vahemikus portide kasutamine"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Väikseim port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Suurim port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Aegumised"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Ühenduse kontrollimise aegumine (sekundites):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Andmete ülekande aegumine (sekundites):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Kiirusepiirang"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Allalaadimine (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Üleslaadimine (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "&Kettaruum"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Vaba kettaruumi kontroll"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Ülekanne peatatak&se, kui vaba ruumi napib"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervall (sek):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimaalne vaba ruum (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Lõime&d"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Lõimede arv seansi kohta:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Ülekandeks kasutatakse esmast ühendust"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Muud"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Ebaõnnestunud ülekandeid proovitakse automaatselt uuesti"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Taasproovimiste maks. arv enne ebaõnnestunuks märkimist:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Muu"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "Lohistamisel seatakse &failid järjekorda (mitte ei hakata edastama)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Tühjad&e kataloogide vahelejätmine järjekorda seadmisel"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Ühen&duse katkestamisel küsitakse kinnitust"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Masinanimi:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokoll:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP üle TLS/SSL (aktiivne)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP üle TLS/SSL (passiivne)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP üle SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Saidi nimi:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Võrgukataloog:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Kohalik kataloog:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonüümne sisselogimine"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Muud"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Laiendatud &passiivse režiimi keelamine"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Passiivse režiimi keelamine"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Saidi IP kasutamine passiivses režiimis ühenduste korral"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+"\"Aktiivse režiimi pealesundimine selle IP kasutamiseks\" keelamine selle saidi "
+"korral"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "STAT kasutamine kataloogi sisu lugemisel"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Mitu ülekandelõime"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Selle saidi korral mitut lõime ei kasutata"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Serveri kodeering"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kodeering:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Uuestiproovimine ja elushoidmine"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "E&baõnnestumisel üritatakse uuesti ühenduda"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Uuestiproovimine"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Uuestiproovimiste arv (0 = piiramatu):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Uuestiproovimise viivitus:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Elushoidmise pakettide kasutamine ühenduse hoidmiseks avatuna"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Elushoidmine"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Elushoidmise sagedus (sek):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "AS&CII laiendused"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Lisa laiendus"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Laiendus:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Laiendus"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Viimati kasutatud ühendused"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Ühendus:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Kirjuta siia täielik URL"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Kirjuta FTP masinanimi"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "A&nonüümne sisselogimine"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Märgi anonüümseks sisselogimiseks"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Kirjuta konto kasutajanimi"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Kirjuta konto parool"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Lisatakse &järjehoidjatesse"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Muud"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Andmeühenduse seadistused"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Režiim:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Andmekanal krüptitakse alati"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Krüptimine ainult kataloogi sisu lugemisel"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Andmekanalit ei krüptita"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 sertifikaat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Ühendumisel kasutatakse järgmist SSL sertifikaati"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Asukoht:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-posti &aadress:"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "J&uhtimiskeskuse e-posti aadressi kasutamine"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-posti aadress:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Käivitamine ja väljumine"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "&Kinnituse küsimine väljumisel, kui on aktiivseid ülekandeid"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "&Rakendus käivitatakse minimeerituna süsteemsesse salve"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Käivitu&sekraani näitamine"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "&Ikooni näitamine süsteemses salves"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Väljum&ine X-nupule klõpsamise korral"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Saidi vaikeväärtused"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Järjehoidja&fail krüptitakse"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "KDE &turvalaeka saitide näitamine järjehoidjates"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "Märgua&nded"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Õhupallid"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Õhu&palli näitamine ülekande lõpetamisel"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Näitamine ainult siis, kui &järjekord jääb ülekande järel tühjaks"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Õ&hupalli näitamine ühenduse uuestiproovimise õnnestumisel"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Fail:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "puudub"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Failide nimekiri"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Töötlemata"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Korras"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Ei leitud"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Ebaõnnestus"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Peaakna suurus."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Peaakna asukoht ekraanil."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Vaikimisi uuestiproovimiste arv uute saitide korral."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Vaikimisi uuestiproovimise viivitus uute saitide korral."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Kas näidata õhupalli mõningate toimingute lõpetamisel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Kas näidata õhupalli kõigi järjekorras olnud ülekannete lõpetamisel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Kas näidata õhupalli, kui uuestiproovimise järel luuakse edukalt ühendus "
+"serveriga."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Kas küsida kinnitust väljumisel, kui on aktiivseid ülekandeid."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Järjehoidjafaili krüptimise valik."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Vaikimisi kohalik kataloog."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Kas rakendus peab lõpetama töö. kui kasutaja klõpsab X-nupule."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Kas käivitada rakendus minimeerituna."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Kas näidata rakenduse käivitamisel käivitamisekraani."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Kas näidata ikooni süsteemses salves."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Kas näidata järjehoidjate seas KDE turvalaeka saite."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Kas näidata enne iga ühenduse katkestamise soovi täitmist vastavat "
+"kinnitusdialoogi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Saidi vaikimisi kodeering."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Viimati kiirühendusega kasutatud saidid."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Failimustrite nimekiri, mille puhul ülekandel tuleb kasutada ASCII režiimi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Kas jätta tühjad kataloogide vahele."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Font, mida kasutada logividina jaoks."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Serverisse saadetavate käskude värv."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Serveri vastuste värv."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Serveri mitmerealiste vastuste värv."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Veateadete värv."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Olekuteadete värv."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Kas kirjutada logi ka faili."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Fail, millesse logi kirjutada."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Kas kasutada aktiivsete ülekannete korral porti määratud portide vahemikust."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Portide vahemiku algus."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Portide vahemiku lõpp."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Kas tühistada aktiivsete ülekannete korral IP."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "Käsu PORT tühistamisel saadetav IP."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Kas eirata välist IP-d kohtvõrguühenduste korral."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr "Kas lohistamisel panna ülekanded järjekorda või alustada ülekannet."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Kas KFTPGrabber peab kontrollima vaba ruumi olemasolu ja peatama ülekande, kui "
+"seda napib."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Ketta kontrollimise intervall."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Minimaalne kettaruum (MiB), mis peab olema saadaval."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"KDE globaalse e-posti aadressi kasutamine anonüümse kasutaja paroolina."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "Anonüümse kasutaja paroolina kasutatav e-posti aadress."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Lõimede arv ülekannete ajal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Kas kasutada ülekannetel esmast ühendust."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Aegumine (sekundites) ühenduse kontrollimisel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Aegumine (sekundites) andmete ülekandel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Globaalne allalaadimise kiirusepiirang (kilobaiti sekundis)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Globaalne üleslaadimise kiirusepiirang (kilobaiti sekundis)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Kas ebaõnnestunud ülekandeid automaatselt uuesti proovida."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"Uuestiproovimiste maksimaalne arv enne ülekande märkimist ebaõnnestunuks."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Kas näidata vaikimisi kataloogipuud."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Kas näidata sirvimisel peidetud faile."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr "Kas näidata failisuurust baitides või \"inimlikus\" vormingus."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Kas näidata iga faili omanikku ja gruppi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Kataloogi suuruse näitamine."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Vasaku külgriba näitamine."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Peamenüü"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Järjehoidjariba"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "'%1' jaoks on kasutajanimi määramata."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Viga ühendumisel"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "DisplaySettings"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "KFTPQuickConnectLayout"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Selle faili avamiseks vajalikku rakendust ei leitud!"
+
+#~ msgid "Webpage design"
+#~ msgstr "Veebilehekülje kujundus"
+
+#~ msgid "Command"
+#~ msgstr "Käsk"
+
+#~ msgid "What's this?"
+#~ msgstr "Mis see on?"
+
+#~ msgid "Server Management"
+#~ msgstr "Serveri haldus"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Allalaadimine: %1 MB Üleslaadimine: %2 MB<br>Krediit: %3 MB Suhe: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Saidi käsu dialoog"
+
+#~ msgid "Username"
+#~ msgstr "Kasutajanimi"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Kirjuta kasutajanimi või klõpsa nupule Loobu"
+
+#~ msgid "Group name"
+#~ msgstr "Grupi nimi"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Kirjuta grupi nimi või klõpsa nupule Loobu"
+
+#~ msgid "Description name"
+#~ msgstr "Kirjeldav nimi"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Kirjuta kirjeldus või klõpsa nupule Loobu"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Paroolid ei klapi"
+
+#~ msgid "Optional"
+#~ msgstr "Pole kohustuslik"
+
+#~ msgid "Password retype:"
+#~ msgstr "Parool uuesti:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Saada too&rkäsk..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Jõudeaja näitamine"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Jõudeaja määramine (seansi kohta)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Jõudeaja määramine (seansi kohta).<br>Võimaldab määrata jõudeaja (aeg, mis võid olla võrgus<br>ilma midagi tegemata). Maksimaalne jõudeaeg on 7200 sekundit.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Võimaldab muuta parooli"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Võimaldab muuta parooli.<br>Parool peab koosnema 8 sümbolist."
+
+#~ msgid "Display the group info"
+#~ msgstr "Grupi info näitamine"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Grupi info näitamine<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Kehtivate aliaste näitamine"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Kehtivate cd käsu asukohtade näitamine"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Kehtiva glftpd versiooni näitamine"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Kehtiva glftpd versiooni näitamine<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Parajasti võrgus olevate kasutajate näitamine"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Parajasti võrgus olevate kasutajate näitamine<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Tervitusekraani näitamine"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Tervitusekraani näitamine<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Saidi kehtiva kellaaja näitamine"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Saidi kehtiva kellaaja näitamine<br>"
+
+#, fuzzy
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Hiljuti unnuked väljalasete näitamine"
+
+#, fuzzy
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Hiljuti unnuked väljalasete näitamine<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Kasutaja kustutamine, saab uuesti lisada käsuga site READD"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Kasutaja kustutamine, saab uuesti lisada käsuga site READD<br><br><i>Näide:</i> site deluser Archimede<br><br>See aktiveerig kasutajal 'Archimede' lipu DELETED (6).<br>Kasutaja täielikuks kustutamiseks tuleb anda käsk 'site purge'.<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Kasutaja parooli muutmine"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Kasutaja parooli muutmine<br><i>Näide:</i> site chpass Archimede uusparool<br>See muudab kasutaja 'Archimede' parooliks 'uusparooli'.<br><br>Vaata \"site passwd\", kui saad veateate, et parool pole piisavalt turvaline.<br><br>* tähendab suvalist parooli. <i>Näide:</i> site chpass arch *<br>See lubab kasutajal 'arch' sisse logida suvalise parooliga.<br><br>@ tähendab e-posti aadressi moodi parooli. <i>Näide:</i> site chpass arch @<br>See lubab kasutajal 'arch' sisse logida parooliga a@b.com, aga mitte parooliga ab.com.<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Kasutaja gadmin-staatuse lülitamine antud grupis"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Kasutaja gadmin-staatuse lülitamine antud grupis<br><b>MÄRKUS:</b> kui kasutaja on gadmin, lisatakse talle automaatselt lipp 2.<br>Kui kasutaja pole enam ühegi grupi gadmin,<br>eemaldatakse gadmin-lipp automaatselt.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Kasutaja lippude näitamine"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Kasutaja lippude näitamine<br><br><i>Näide:</i> site flags<br><br>See näitab sinu enda lippe.<br><br><i>Näide:</i> site flags Archimede<br><br>See näitab kasutaja Archimede lippe.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Kasutaja väljalöömine saidilt"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Kasutaja väljalöömine saidilt<br><br><i>Näide:</i> site kick Archimede<br><br>See tapab kõik kasutaja Archimede ühendused.<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Kustutatud kasutajate eemaldamine, pärast seda enam site READD ei toimi."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Kustutatud kasutajate eemaldamine, pärast seda enam site READD ei toimi.<br><br><i>Näide:</i> site purge<br>See eemaldab KÕIK kasutajad, kellel on lipp DELETED.<br><br><i>Näide:</i> site purge frank<br>See eemaldab ainult kasutaja 'frank', aga mitte teisi kustutatud kasutajaid.<br><br>Kui oled gadmin, võid hävitada ainult oma grupi kasutajaid<br>(seda juhul, kui konfiguratsioonifailis on sulle ligipääs sellele käsule antud).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Kasutaja taaslisamine"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Kasutaja taaslisamine<br><br><i>Näide:</i> site readd<br><br>See näitab kasutajate nimekirja, keda saab uuesti lisada.<br>(Sama tulemuse saab käsuga \"site users deleted\")<br><br><i>Näide:</i> site readd Archimede<br><br>See eemaldab kasutajalt 'Archimede' lipu DELETED.<br><br><b>MÄRKUS:</b> mõne grupi kasutajat uuesti lisades, peab grupis olema selleks ruumi,<br>seda isegi siis, kui oled saidioperaator.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Kasutaja üles/allalaadimise statistika näitamine"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Kasutaja üles/allalaadimise statistika näitamine<br><br>Defineeritav failis '/ftp-data/text/user.stats'<br><br>Kui sul on mitu sektsiooni, näidatakse kõigi sektsioonide statistika.<br>(Kuid see fail tuleb kopeerida faili SEKTSIOONuser.stats)<br>Näide: kui sul on sektsioon GAMES, otsib glftpd<br>kataloogis /ftp-data/text faile user.stats ja GAMESuser.stats.<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Kasutajate nimekiri / Kasutaja detailse info näitamine"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Kasutajate nimekiri / Kasutaja detailse info näitamine<br><br><i>Näide:</i> site user<br><br>Näitab kõigi parajasti saidis olevate kasutajate nimekirja.<br><br><i>Näide:</i> site user Archimede<br><br>Näitab detailset infot kasutaja 'Archimede' kohta.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Saadaolevate gruppide näitamine"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Grupi detailse info näitamine"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Grupi detailse info näitamine<br><br><i>Näide:</i> site ginfo ftp<br><br>Näitab detailset infot grupi 'ftp' kohta.<br>Kui kasutaja on kustutatud, seisab tema real \"***DELETED***\".<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Uue grupi lisamine"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Uue grupi lisamine<br><br><i>Näide:</i> site grpadd grupp uus_grupp<br><br>See lisab grupi 'grupp' kirjeldusega 'uus_grupp'.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Grupi kustutamine"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Grupi kustutamine<br><br><i>Näide:</i> site grpdel grupp<br><br>See kustutab grupi 'grupp'.<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Praeguste gruppide või grupi lahkumiste/liitumiste näitamine"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Praeguste gruppide või grupi lahkumiste/liitumiste näitamine<br>Grupiga liitumiseks anna käsu parameetrina grupi nimi.<br>Sa peab lahkuma kõigist gruppidest, enne kui saad liituda uuega.<br>Ainult saidioperaatori lipuga kasutajad võivad muuta privaatgruppe (vaata site CHGRP).<br><br><br><i>Näide:</i> site group<br><br>See näitab gruppe, millesse sa kuulud.<br><br><i>Näide:</i> site group ftp<br><br>Selle käsuga saab grupiga 'ftp' liituda või sellest lahkuda.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Grupi kirjelduse muutmine"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Grupi kirjelduse muutmine<br><br><i>Näide:</i> site grpnfo ftp uus_kirjeldus<br><br>Sellega antakse grupile 'ftp' senise kirjelduse asemel 'uus_kirjeldus'.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Kehtiva oleku näitamine"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Kõigi aegade suurimate allalaadijate näitamine"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Kõigi aegade suurimate allalaadijate näitamine"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Kõigi aegade suurimate gruppi kuuluvate allalaadijate näitamine"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Kõigi aegade suurimate gruppi kuuluvate allalaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Kõigi aegade suurimate üleslaadijate näitamine"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Kõigi aegade suurimate gruppi kuuluvate üleslaadijate näitamine"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Kõigi aegade suurimate gruppi kuuluvate üleslaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Päeva suurimate üleslaadijate näitamine"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Päeva suurimate gruppi kuuluvate üleslaadijate näitamine"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Päeva suurimate üleslaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display daytop download"
+#~ msgstr "Päeva suurimate allalaadijate näitamine"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Päeva suurimate gruppi kuuluvate allalaadijate näitamine"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Päeva suurimate allalaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Kuu suurimate üleslaadijate näitamine"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Kuu suurimate gruppi kuuluvate üleslaadijate näitamine"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Kuu suurimate üleslaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Kuu suurimate allalaadijate näitamine"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Kuu suurimate gruppi kuuluvate allalaadijate näitamine"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Kuu suurimate allalaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#, fuzzy
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Kõigi aegade suurimate nuketop näitamine"
+
+#, fuzzy
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Kõigi aegade suurimate nuketop näitamine"
+
+#, fuzzy
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Kõigi aegade suurimate gruppi kuuluvate nuketop näitamine"
+
+#, fuzzy
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Kõigi aegade suurimate nuketop näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Nädala suurimate üleslaadijate näitamine"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Nädala suurimate gruppi kuuluvate üleslaadijate näitamine"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Nädala suurimate üleslaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Nädala suurimate allalaadijate näitamine"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Nädala suurimate gruppi kuuluvate allalaadijate näitamine"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Nädala suurimate allalaadijate näitamine<br><grupp> pole kohustuslik. Selle määramisel näidatakse ainult antud grupi kasutajaid,<br>kuid seda tegeval kasutajal peab olema ligipääs ja vastavad õigused failile glftpd.conf.<br>Seda kontrollib valik -grpstats.<br>"
+
+#~ msgid "Display server traffic"
+#~ msgstr "Serveri liikluse näitamine"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Serveri liikluse näitamine<br>Kõigi sektsioonide kõigi kasutajate kõigi üles- ja allalaadimiste kogusumma näitamine."
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Kõigi aegade suurimate üleslaadimistega gruppide näitamine"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Kõigi aegade suurimate üleslaadimistega gruppide näitamine<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Kuu suurimate üleslaadimistega gruppide näitamine"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Kuu suurimate üleslaadimistega gruppide näitamine<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Kuu suurimate allalaadimistega gruppide näitamine"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Kuu suurimate allalaadimistega gruppide näitamine<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Nädala suurimate üleslaadimistega gruppide näitamine"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Nädala suurimate üleslaadimistega gruppide näitamine<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Nädala suurimate allalaadimistega gruppide näitamine"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Nädala suurimate allalaadimistega gruppide näitamine<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Kõigi aegade suurimate allalaadimistega gruppide näitamine"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Kõigi aegade suurimate allalaadimistega gruppide näitamine<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Kasutaja kasutajafaili laadimine protsessi mällu, sisuliselt muutumine antud kasutajaks."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Kasutaja kasutajafaili laadimine protsessi mällu,<br>sisuliselt muutumine antud kasutajaks (kuigi teatud asju ei muudeta,<br>näiteks kodukataloogi või 'site who' näitamist.<br>Vajab konfiguratsioonifailis õigust -emulate.<br>See on mõeldud spetsiaalselt skriptidele, et need saaks tegutseda<br>kui kasutaja ilma antud kasutaja paroli teadmata ja tema eest sisse logimata.<br>Enamik saidioperaatoreid vaevalt seda kasutab.<br><br>Märkus: see ei ole TÕELINE emuleerimine, seda ei tohiks kasutada tõsisemate asjade korral.<br>Mõned asjad ei tööta ja mõned ei tööta korralikult.<br>Ainuke 'tõeline' emuleerimine on kasutajana sisse logida.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Abiekraani näitamine"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Abiekraani näitamine<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Ebaõnnestunud sisselogimiste näitamine"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Ebaõnnestunud sisselogimiste näitamine<br><br>See näitab faili '/glftpd/ftp-data/logs/login.log'.<br>Vaata süntaksi infot käsuga \"site syslog\".<br>"
+
+#, fuzzy
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Hiljuti nuked väljalasete näitamine"
+
+#, fuzzy
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Hiljuti nuked väljalasete näitamine<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Kasutaja viimase võrgusoleku aja kontroll"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Kasutaja viimase võrgusoleku aja kontroll<br><br><i>Näide:</i> site seen Archimede<br><br>See näitab viimast aega, mil kasutaja Archimede oli sisse logitud.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Kasutajafaili näitamine toorvormingus"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Kasutajafaili näitamine toorvormingus<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Võrgus olevate kasutajate detailse info näitamine"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Võrgus olevate kasutajate detailse info näitamine<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Saada järjehoidjad"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Ühtki kontakti pole saadaval>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Keelatus KDE käesolevas versioonis>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Kavatsed saata oma KFTPGrabberi järjehoidjad kasutajale <b>%1</b>. Need võivad sisaldada paroole või X509 sertifikaate, mistõttu järjehoidjate saatmine sisaldab turvariski.<br><br>Kas kindlasti jätkata?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Saada järjehoidjad"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "See server on 'distributed FTP daemon'"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Kas tõesti kustutada fail(id)?"
+
+#~ msgid "Date"
+#~ msgstr "Kuupäev"
+
+#~ msgid "Permissions"
+#~ msgstr "Õigused"
+
+#~ msgid "Owner"
+#~ msgstr "Omanik"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Kataloogi '%1' avamine ebaõnnestus."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "See kataloog sisaldab 1 faili.\n"
+#~ "See kataloog sisaldab %n faili."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Kõigi näitamiseks võib kuluda aega."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Oled sa ikka kindel?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Ülekanne..."
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Üldine"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Uue mustri lisamine"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Kas tõesti see muster eemaldada?"
+
+#~ msgid "&Other"
+#~ msgstr "&Muu"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Alla&laadimisel antakse failidele väikesetäheline nimi"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "&Esiletõstmine"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "Lis&a muster..."
+
+#~ msgid "E&dit..."
+#~ msgstr "Muu&da..."
+
+#~ msgid "Re&move"
+#~ msgstr "Ee&malda"
+
+#~ msgid "E&nabled"
+#~ msgstr "Lu&batud"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Pr&ioriteedinimekiri"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Prioriteedimuster:"
+
+#~ msgid "Patterns"
+#~ msgstr "Mustrid"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "Lis&a muster"
+
+#~ msgid "&Low"
+#~ msgstr "&Väike"
+
+#~ msgid "Value:"
+#~ msgstr "Väärtus:"
+
+#~ msgid "&Skip"
+#~ msgstr "Jäetak&se vahele"
+
+#~ msgid "&High"
+#~ msgstr "&Suur"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Prioriteedinimekirja seadistused"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "Prioriteedi&nimekirja lubamine"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "Tüh&jade failide vahelejätmine"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Pr&ioteedinimekirja rakendamine kataloogidele"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Va&helejätmiste nimekirja faile ei lisata järjekorda"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Kataloogid seatakse järjekorras failide ette"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "Sirvimisel esiletõstetavate failimustrite nimekiri."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Kas tõsta filtrinimekirjas olevad failid esile."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Kas jätta vahele vahelejätmiste nimekirjas olevad failid."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Kas jätta tühjad failid vahele."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Kas rakendada vahelejätmiste nimekirja ka kataloogidele."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Vahelejätmiste nimekirja faile ei lisata järjekorda."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Kataloogid asetatakse järjekorras failide ette."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Kas muuta kõik allalaaditavate failide nimed väikesetäheliseks."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "&Hävita"
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/kftpgrabber.po b/translations/fr/messages/kftpgrabber.po
new file mode 100644
index 0000000..0d4be67
--- /dev/null
+++ b/translations/fr/messages/kftpgrabber.po
@@ -0,0 +1,3676 @@
+# translation of kftpgrabber.po to Français
+# mrlag <mrlag@buggynet.org>, 2005.
+# Nicolas Ternisien <nicolas.ternisien@gmail.com>, 2005.
+# translation of fr.po to
+# translation of fr.po to
+# translation of fr.po to
+# translation of fr.po to
+# translation of kftpgrabber.po to
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2005-11-01 23:25+0100\n"
+"Last-Translator: Nicolas Ternisien <nicolas.ternisien@gmail.com>\n"
+"Language-Team: Français <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.11\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "connexion"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Dossier"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Priorité"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Téléchargement"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Envoyer"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Nom de fichier"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Taille"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "&Changer de site"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Destination"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Importation de gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Importation de KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Importation de NcFtp"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Tous les transferts de la liste sont terminés."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Le fichier existe"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - un client FTP pour KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Développeur principal"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Développeur"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Code de LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Code de « otpCalc »"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Code de la fenêtre surgissante KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Élément graphique du débit réseau"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Conception des icones"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Tests et débogages"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Nom du dossier :"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Le transfert de tous les fichiers est terminé:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "Échec de la connexion vers « %1 »."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "Échec du transfert de fichier."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Fichier source non trouvé."
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Permissions"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Impossible d'ouvrir le fichier en écriture."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Le transfert des fichiers suivants <b>a été interrompu</b> "
+"à cause d'un manque d'espace disque sur %1 :"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Impossible d'établir une connexion SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Authentification..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "La connexion a échoué."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Impossible d'initialiser le canal SFTP."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Impossible d'initialiser SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "déconnecté"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Connexion..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Connexion vers « %1:%2 »..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Annuler"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "Téléchargement de la liste de fichiers du dossier..."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Téléchargement de la liste de fichiers du dossier..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "En transfert..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Suppression des dossiers..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Renommer"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Échec de la connexion vers « %1 »."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Impossible de se connecter."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Nouvel essai de connexion (%1/%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Impossible d'établir une connexion TLS."
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "En attente de connexion..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Connexion établie."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "Transfert FXP correctement effectué."
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Scan des dossiers..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "En transfert..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "déconnecté"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Échec de la connexion vers « %1 »."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Inactif"
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Vérification terminée."
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Téléchargement de la liste de fichiers du dossier..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Attente de %1 secondes avant de tenter une nouvelle connexion..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Renommer"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Nouvel essai de connexion..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Nouvel essai de connexion..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Nouvel essai annulé."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Actions lorsque le fichier existe (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Taille / Temps"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Identique"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Plus vieux"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Plus récent"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Plus petit"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Plus gros"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Passer"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Remplacer"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Reprendre"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Renommer"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Demander"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Journal (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Session locale"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "La connexion avec %1 a été correctement établie."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Veuillez fournir le mot de passe de déchiffrement de votre clé privée."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Session"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Au moins une session doit rester ouverte de chaque coté."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Veuillez terminer tous les transferts avant de fermer la session."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Cette session est actuellement connectée. Voulez-vous vraiment vous "
+"déconnecter ?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Fermer la session"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "&Connexion rapide..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nouvelle session"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "Côté &gauche"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Côté &droit"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Mode de &transfert (Auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binaire"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Mode de &transfert (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Mode de &transfert (Binaire)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Sélectionner..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Aucun nom"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Transfert"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Description"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Aucun transfert échoué."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Redémarrer le transfert"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Ajouter à la file"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Tout ajouter à la file"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Enlever"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Tout supprimer"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Voulez-vous vraiment supprimer ce transfert échoué ?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Voulez-vous vraiment supprimer tous les transferts échoués ?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nouveau motif"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Motif de fichier :"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Couleur:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Connexion rapide"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "un nom d'hôte"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "un port valable"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "votre nom d'utilisateur"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "votre mot de passe"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " et"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Veuillez saisir "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Veuillez fournir votre certificat de décryptage de mot de passe X509."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Sites proches"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Aucun site publié."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Motif"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Couleur"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Ajouter un motif"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Activé"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Surbrillance"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Pas encore implémenté.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Passer la liste"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Extensions ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Général"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Transferts"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Affichage"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Actions"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtres"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Vérification de la somme de contrôle"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Somme de contrôle"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Vérification terminée."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Impossible d'ouvrir le fichier de sommes de contrôles ou format du fichier "
+"incorrect."
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Nom de fichier"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filtres"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Téléchargement"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Renommer"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Plus récent"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Renommer"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Co&nnexion"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Chercher et remplacer"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Utilisation de la bande passante"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "en pause"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "lancé"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "En attente de connexion..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtre : "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nom"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Source"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Destination"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Progression"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Vitesse"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Vous n'avez aucun fichier dans la liste."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Téléchargement"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Threads"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Démarrer le tran&sfert"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Annuler le transfert"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "&Tout supprimer"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Mon&ter"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Des&cendre"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Mon&ter"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Modifier les informations de transfert"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Charger la liste à partir d'un fichier"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "Enregi&strer la liste dans un fichier"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "Dépar&t"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pause"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Ajouter un transfert..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Recherche et remplacement..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Montrer le &filtre"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Site"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Voulez-vous vraiment supprimer ces fichiers de la liste ?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Voulez-vous vraiment supprimer tous ces fichiers de la liste ?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Le chargement d'une nouvelle liste écrasera l'existante ; voulez-vous vraiment "
+"continuer ?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Charger une liste"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Session de site [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Processus %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "en attente"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "déconnecté"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "connexion"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "en transfert"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "État"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Aucun thread lancé pour le moment."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Pas de signets."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nouveau..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Renommer"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Créer une sous-catégorie..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Dupliquer"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Site"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Nom de la catégorie"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Renommer la catégorie :"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nouveau nom de catégorie"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nouvelle catégorie :"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Nouveau serveur"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Nouveau serveur"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Voulez-vous vraiment supprimer cette catégorie ?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Voulez-vous vraiment supprimer ce serveur ?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Impossible de charger le module d'importation sélectionné."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Le fichier sélectionné n'existe pas ou ne peut pas être lu."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Importation des signets terminée avec succès."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "Édit&er..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Paramètres SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importer..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exporter..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Éditeur de signets FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Vous êtes sur le point d'exporter vos signets KFTPGrabber. Ils peuvent "
+"contenir des mots de passes ou des certificats X509 personnels. Cet exportation "
+"peut compromettre leur sécurité."
+"<br>"
+"<br>Voulez-vous vraiment effectuer l'exportation ?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Exporter les signets"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Annuler"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Afficher l'arborescence"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Propriétés"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Broyer"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Filtres"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "Un ensemble de priorités sur les fichiers de la liste d'attente."
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Transfert"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Liste de transfert"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Créer un dossier..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Ouvrir un fichier"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Vérifier..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "Actions supplé&mentaires"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Exporter la liste de fichiers du dossier..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Afficher les fichiers et dossiers cac&hés"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Créer le dossier"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Envoyer directement une commande"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Changer de site"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Connexion &rapide..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "Se &connecter à"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Déconnecter"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Modifier l'&encodage distant"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Voulez-vous arrêter la connexion actuelle ?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Voulez-vous vraiment broyer ce fichier ?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Broyer"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Supprimer le fichier"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Passer"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Priorité"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Créer le dossier"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Nom du dossier :"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Envoyer directement une commande"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Commande :"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Exporter la liste de fichiers du dossier"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Général"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Dossier distant"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Type :"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Emplacement :"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Taille :"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Créé :"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Permissions"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Permissions d'accès"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Classe"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Afficher les\n"
+"entrées"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Lecture"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Ajout d'\n"
+"entrées"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Écriture"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Passage"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Exécution"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Spécial"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Utilisateur"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Groupe"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Autres"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Définir l'UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Définir le GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Dossier racine"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Chemin : "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Ceci est une connexion SSH chiffrée. Aucune information de certificat "
+"disponible pour le moment."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Filtres"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Créer le dossier"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Liste de fichiers"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "&Changer de site"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> logger initialisé.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Impossible d'ouvrir le fichier en écriture."
+
+#: src/mainwindow.cpp:153
+#, fuzzy
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Impossible de trouver le fichier de descripteur XML de l'interface. "
+"Veuillez vérifier que votre application est correctement installée. Si vous "
+"avez des questions, veuillez les poser sur %2. "
+"<br> "
+"<br><b>Attention : </b>L'interface actuelle sera incomplète !</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>La fermeture de la fenêtre principale de KFTPGrabber laissera le programme "
+"lancé dans la boîte à miniature. Utilisez l'action <b>Quitter</b> "
+"du menu de KFTPGrabber pour fermer l'application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Conserver dans la boîte à miniature"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Il y a actuellement un transfert en cours.\n"
+"Il y a actuellement %n transferts en cours."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Voulez-vous vraiment quitter ?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Sites FTP proches"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Sites dans KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Modifier les signets..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Réception : %1 / s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Envoi : %1 / s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "File d'attente"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Transferts échoués"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Sites proches"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Threads"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Débit"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Copie de"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Ce fichier de signets est chiffré. Veuillez saisir la clé de déchiffrement."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Échec du déchiffrement de vos signets avec votre clé. Voulez-vous <b>"
+"remplacer</b> vos signets par un fichier vide ?"
+"<br>"
+"<br><font color=\"red\"><b>Attention :</b>Si vous les écrasez, vous perdrez "
+"définitivement vos signets.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Échec du déchiffrement"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Écraser les signets"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Saisissez une clé pour chiffrer le fichier des signets."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Aucun service publié>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD non disponible>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Aucun site dans KWallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Vincent Reydet,Nicolas Ternisien"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "mrlag@buggynet.org,nicolas.ternisien@gmail.com"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "A&ffichage"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Explorateur de fichiers"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Afficher les fichiers et dossiers cac&hés"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Afficher l'ar&borescence"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Afficher la ta&ille des fichiers en octets (plutôt que d'utiliser le format "
+"compréhensible)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Afficher le pr&opriétaire et le groupe de chaque fichier"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Afficher l'ar&borescence"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Montrer le &filtre"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Recherche et remplacement dans la liste"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"En utilisant cette fenêtre, vous pouvez effectuer des remplacements globaux sur "
+"les chemins sources et destinations de la liste de transferts. <b>"
+"Les changements ne peuvent pas être annulés.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Que chercher"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destination :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Source :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Chercher uniquement les transferts sur un serveur spécifique"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Informations sur le serveur"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Nom du serveur :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Hôte :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Utilisateur :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port :"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Remplacer par"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Assistant d'importation des signets"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Étape 1 : <b>Sélectionnez le module d'importation</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Image"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Veuillez sélectionner le module d'importation souhaité dans la liste "
+"ci-dessous. Chaque module est en mesure d'importer un format différent."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Modules d'importations disponibles :"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Étape 2 : <b>Sélectionnez le fichier de signets à importer</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Veuillez sélectionner le fichier de signets que vous souhaitez importer dans "
+"votre liste. Un chemin par défaut a été déterminé par le module d'importation."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Chemin des signets :</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Étape 3 : <b>Importation des signets...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Veuillez patienter lors de l'importation des signets."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Progression de l'importation :</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Apparence"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Police et couleurs"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Police :"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Couleur des commandes du client :"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Couleur des réponses du serveur :"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Couleur des réponses sur plusieurs lignes :"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Couleur des messages d'erreurs :"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Couleur des messages d'états :"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Sortie"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&Fichier de sortie"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Enregi&strer le journal dans un fichier"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Fichier de sortie :"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Informations sur le serveur source"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Informations sur le serveur de destination"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Source :</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Destination :</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Type de transfert :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Co&nnexion"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "Activer la connexion IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Forcer « PORT / EPRT » à utiliser l'adresse IP configurée"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "Adresse IP / nom d'hôte :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Activer l'intervalle de ports de connexions"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Utiliser un&iquement les ports de l'intervalle spécifié"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Port minimal :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Port maximal :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Temps d'expiration"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Temps d'expiration du contrôle de la connexion (en sec.) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Temps d'expiration du transfert de données (en sec.) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Vitesse limite"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Réception (ko/s) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Émission (ko/s) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Espace dis&que"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Vérification de l'espace disque disponible"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Arrêter le transfert lorsqu'il &n'y a plus assez d'espace disque libre"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervalle (sec.) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Espace libre minimum (Mo) :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Proc&essus"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Nombre de processus par session :"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Aucun transfert échoué."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Divers"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"&Placer les fichiers en attente (au lieu de les télécharger) lors d'un "
+"glisser / déposer"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Ignorer les d&ossiers vides"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Demander la confirmation de la déconnexion &avant de l'effectuer"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Nom d'hôte :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocole :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP utilisant TLS/SSL (explicite)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP utilisant TLS/SSL (implicite)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP sur SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Libellé du site :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Dossier distant :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Dossier local :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "Connexion &anonyme"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "A&vancé"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Désac&tiver l'utilisation du mode passif étendu"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Désactiver l'utilisation du mode passif"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Utiliser la commande « STAT » pour consulter le contenu d'un dossier"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Processus de transferts multiples"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Ne pas utiliser plusieurs processus pour ce site"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Encodage du serveur"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Encodage :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Relan&cer la connexion en cas d'échec"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Nouvel essai"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Nombre de tentatives (0 = infini) :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Délai entre chaque tentative :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "E&xtensions ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Ajouter une extension"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Extension :"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Extension"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Nouvel essai de connexion..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Nouvel essai de connexion..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Saisissez l'URL complète dans cette entrée"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Saisissez le nom d'hôte du serveur FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Connexion anon&yme"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Vérifier la connexion anonyme"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Saisissez le nom d'utilisateur du compte"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Saisissez le mot de passe du compte"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Ajouter aux &signets"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avancée"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Connexion établie."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Utiliser la commande « STAT » pour consulter le contenu d'un dossier"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Certificat X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Utiliser le certificat suivant pour se connecter"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Chemin :"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "&Adresse électronique"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Utiliser l'adresse électronique du Centre de configuration"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Adresse électronique :"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Démarrage et fermeture"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Confirmer la fermet&ure du programme s'il reste des transferts actifs"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Lancer le programme ré&duit dans la boîte à miniatures"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "A&fficher l'écran de démarrage"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Afficher l'icône dans la boîte à &miniatures"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Paramètres par défaut du site"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Chif&frer le fichier des signets"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, fuzzy, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Afficher les sites de KWallet dans les &signets"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Notification"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Bulles"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Afficher une &bulle à la fin d'un transfert"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+"Afficher uni&quement lorsque la liste est vide une fois les transferts "
+"effectués"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Afficher une bulle lors de la réussite d'une &reconnexion"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Fichier :</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "aucun"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Liste de fichiers"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Non effectué"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Valider"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Non trouvé"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Échec"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "La taille de la fenêtre principale."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "La position de la fenêtre principale sur l'écran."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Nombre de tentatives de reconnexions sur les nouveaux sites."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Temps d'attente avant reconnexion aux nouveaux sites."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Affichage d'une bulle lors de l'aboutissement de certaines actions."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Affichage d'une bulle lorsque tous les transferts de la liste sont terminés."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Affichage d'une bulle si la connexion au serveur réussit après des tentatives "
+"infructueuses."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+"Confirmer la sortie du programme lorsqu'il reste des transferts actifs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "État de chiffrement du fichier des signets."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Dossier local par défaut."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Réduire l'application à son démarrage."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Réduire l'application à son démarrage."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Affichage de l'écran de démarrage au lancement de l'application."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Affichage de l'icône dans la boîte à miniatures."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Affichage des sites de KWallet dans les signets."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Affichage d'une fenêtre de confirmation dès qu'une déconnexion est demandée."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "L'encodage par défaut du site."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Une liste de motifs de fichiers pour lesquels le mode ASCII doit être utilisé "
+"lors du transfert."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Ignorer les dossiers vides."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "La police utilisée dans le journal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "La couleur des commandes envoyées au serveur."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "La couleur des réponses du serveur."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "La couleur des réponses sur plusieurs lignes du serveur."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "La couleur des messages d'erreurs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "La couleur des messages d'états."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Enregistrer le journal dans un fichier."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Le fichier dans lequel enregistrer le journal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Utiliser un port dans un intervalle spécifié pour les transferts actifs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Le début de l'intervalle de port."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "La fin de l'intervalle de port."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "L'adresse IP doit-elle être remplacée lors de transferts actifs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "L'adresse IP à envoyer lors d'une réponse à la commande « PORT »."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Mettre les transferts dans la liste plutôt que de les démarrer en cas de "
+"glisser / déposer."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"KFTPGrabber doit-il vérifier l'espace restant et annuler en cas d'espace libre "
+"insuffisant."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Intervalle de vérification du disque."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Espace disque minimale (en Mo) devant être disponible."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"Utiliser l'adresse électronique principale de KDE pour les mots de passe "
+"anonymes."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "L'adresse électronique utilisée comme mot de passe anonyme."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Nombre de processus à utiliser lors du transfert."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+"Confirmer la sortie du programme lorsqu'il reste des transferts actifs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Temps d'expiration (en secondes) pour le contrôle de la connexion."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Temps d'expiration (en secondes) pour les transferts de données."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Limite globale de réception (ko/sec)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Limite globale d'émission (ko/sec)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Affichage de l'arborescence par défaut."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Affichage des fichiers cachés par défaut."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Affichage de la taille du fichier en octets plutôt que dans une forme "
+"compréhensible."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Affichage du propriétaire et du groupe de chaque fichier."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Afficher l'ar&borescence"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Montrer le &filtre"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Menu principal"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barre de signets"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Aucun nom d'utilisateur spécifié pour « %1 »."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Erreur de connexion"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Affichage"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Connexion rapide"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Impossible de trouver une application ouvrant ce fichier !"
+
+#~ msgid "Webpage design"
+#~ msgstr "Conception du site Internet"
+
+#~ msgid "Command"
+#~ msgstr "Commande"
+
+#~ msgid "What's this?"
+#~ msgstr "Qu'est-ce que c'est ?"
+
+#~ msgid "Server Management"
+#~ msgstr "Gestion du serveur"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Réception : %1 Mo Émission : %2 Mo<br>Crédits : %3 Mo Taux : %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Fenêtre de commandes des sites"
+
+#~ msgid "Username"
+#~ msgstr "Nom d'utilisateur"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Saisissez un nom d'utilisateur ou annulez"
+
+#~ msgid "Group name"
+#~ msgstr "Nom du groupe"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Saisissez un groupe ou annulez"
+
+#~ msgid "Description name"
+#~ msgstr "Nom descriptif"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Saisissez une description ou annulez"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Les mots de passe ne correspondent pas"
+
+#~ msgid "Optional"
+#~ msgstr "Optionnel"
+
+#~ msgid "Password retype:"
+#~ msgstr "Confirmez le mot de passe :"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Envoyer une commande &brute..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Afficher votre temps de latence"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Définir votre temps de latence (uniquement par session)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Définir votre temps de latence (uniquement par session).<br>Ceci définit le temps de latence (le temps que vous pouvez être connecté <br>sans rien faire). Le temps maximal est de 7200 secondes.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Ceci modifiera votre mot de passe"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Ceci modifiera votre mot de passe.<br>Les mots de passe ne peuvent avoir qu'une longueur de 8 caractères."
+
+#~ msgid "Display the group info"
+#~ msgstr "Afficher les informations du groupe"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Afficher les informations du groupe<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Afficher les alias courants"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Afficher les chemins courants"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Afficher la version de « glftpd »actuelle"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Afficher la version de « glftpd »actuelle<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Afficher les utilisateurs actuellement en ligne"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Afficher les utilisateurs actuellement en ligne<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Afficher l'écran de démarrage"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Afficher l'écran de démarrage<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Afficher le temps local du site"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Afficher le temps local du site<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Afficher les versions récemment sorties"
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Afficher les versions récemment sorties<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Supprimer un utilisateur, peut être lu avec « site READD »"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Supprimer un utilisateur, peut être lu avec « site READD »<br><br><i>Exemple :</i> « site deluser Archimede »<br><br>Cette commande activera le drapeau « DELETED (6) » de l'utilisateur « Archimede ».<br>Afin de le supprimer convenablement, vous devrez alors effectuer la commande « site purge »<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Modifier le mot de passe de l'utilisateur"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Modifier les mots de passe utilisateurs<br><i>Exemple : </i>« site chpass Archimede nouveaumdp »<br>Cette commande remplacera le mot de passe de l'utilisateur<br>« Archimede » par « nouveaumdp ».<br><br>Consultez « site passwd » pour plus d'informations si vous obtenez l'erreur « Le mot de passe n'est pas assez sécurisé ».<br><br>Le symbole « * » autorise tout mot de passe, <i>par exemple : </i>« site chpass arch * »<br>Cette action permet à « arch » de se connecter avec tout mot de passe.<br><br>Le caractère « @ » permet tout mot de passe ressemblant à une adresse électronique, <i>par exemple : </i>« site chpass arch @ »<br>Cette commande autorisera « arch » à se connecter avec le mot de passe « a@b.com » mais pas « ab.com »<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Modifier l'état « gadmin » de l'utilisateur pour le groupe donné"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Modifier l'état « gadmin » de l'utilisateur pour le groupe donné <br><b>Remarque : </b>Lorsque l'utilisateur devient « gadmin » (administrateur du groupe), le drapeau 2 sera ajouté également. <br>Lorsqu'il perd ce droit sur l'un des groupes, le drapeau « gadmin » est automatiquement supprimé."
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Afficher les drapeaux des utilisateurs"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Afficher les drapeaux des utilisateurs <br><br><i>Exemple : </i>« site flags »<br><br>Cette commande affichera vos drapeaux.<br><br><i>Exemple : </i>« site flags Archimede »<br><br>Cette commande affichera les drapeaux de l'utilisateur « Archimede ».<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Bannir un utilisateur du site"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Bannir un utilisateur du site <br><br><i>Exemple : </i>« site kick Archimede »<br><br>Cette commande fermera toutes les connexions de l'utilisateur « Archimede ».<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Enlever les utilisateurs supprimés, la commande « site READD » ne fonctionnera alors plus pour les utilisateurs purgés."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Enlever les utilisateurs supprimés, la commande « site READD » ne fonctionnera alors plus pour les utilisateurs purgés. <br><br><i>Exemple : </i>« site purge »<br>Cette action supprimera tous les utilisateurs avec le drapeau « DELETED » (supprimé).<br><br><i>Exemple : </i>« site purge frank »<br>Cette commande supprimera « frank », mais conservera les autres <br>utilisateurs supprimés.<br><br>Si vous n'êtes que « gadmin », vous ne pourrez purger que les <br>utilisateurs de votre groupe (uniquement si vous avez accès à cette <br>commande dans le fichier de configuration).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Ajouter à nouveau un utilisateur"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Ajouter à nouveau un utilisateur <br><br><i>Exemple : </i>« site readd »<br><br>Cette commande affichera la liste des utilisateurs pouvant être de <br>nouveau ajoutés.<br>(Vous pouvez effectuer la même chose avec « site users deleted »)<br><br><i>Exemple : </i>« site readd Archimede »<br><br>Cette action enlevera le drapeau « DELETED » (supprimé) de <br>l'utilisateur « Archimede ».<br><br><b>Remarque : </b>Lorsque l'utilisateur est ajouté à un groupe, ce <br>groupe doit conservé un emplacement disponible, même si vous <br>êtes un opérateur du site.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Afficher les statistiques d'émission / réception de l'utilisateur"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Afficher les statistiques d'émission / réception de l'utilisateur <br><br>Définition dans « /ftp-data/text/user.stats »<br><br>Si vous possédez des sections multiples, alors les statistiques de <br>toutes ces sections seront affichées. Vous devrez cependant copier <br>ce fichier dans « SECTIONuser.stats ». <br>Exemple : si vous avez une section nommée « GAMES » alors Glftpd <br>consultera les fichiers « user.stats » et « GAMESuser.stats » dans le <br>dossier « /ftp-data/text ».<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Affichage des utilisateurs / Affichage des informations détaillées sur un utilisateur précis"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Affichage des utilisateurs / Affichage des informations détaillées sur un utilisateur précis <br><br><i>Exemple : </i>« site user »<br><br>Cette commande affichera la liste des utilisateurs présents sur le site.<br><br><i>Exemple : </i>« site user Archimede »<br><br>Cette action affichera des informations détaillées sur l'utilisateur <br>« Archimede ».<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Affiche les groupes disponibles"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Affiche les informations détaillées d'un groupe"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Affiche les informations détaillées d'un groupe <br><br><i>Exemple : </i>« site ginfo ftp »<br><br>Cette commande affichera les informations détaillées du groupe « ftp ».<br>Si un utilisateur est supprimé, sa ligne sera remplacée par « ***DELETED*** ».<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Ajouter un nouveau groupe"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Ajouter un nouveau groupe <br><br><i>Exemple : </i>« site grpadd groupe nouveau_groupe »<br><br>Cette action ajoutera le groupe « groupe » avec la description <br>« nouveau_groupe ».<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Supprimer un groupe"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Supprimer un groupe <br><br><i>Exemple : </i>« site grpdel groupe »<br><br>Cette commande supprimera le groupe « groupe ».<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Affiche votre groupe actuel ou vous permet de quitter / joindre un groupe"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Affiche votre groupe actuel ou vous permet de quitter / joindre un groupe <br>Pour rejoindre simplement un groupe, passez le nom de celui-ci en<br>paramètre de la commande. Vous devez absolument quitter les <br>groupes auxquels vous appartenez avant d'en rejoindre un autre. <br>Seuls les utilisateurs ayant le drapeau « siteop » activé peuvent<br>changer de groupes privés (consultez « site CHGRP »).<br><br><i>Exemple : </i>« site group »<br><br>Cette action affichera le groupe dans lequel vous êtes.<br><br><i>Exemple : </i>« site group ftp »<br><br>Avec cette commande, vous pourrez quitter ou rejoindre le groupe <br>« ftp ».<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Modifier la description d'un groupe"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Modifier la description d'un groupe <br><br><i>Exemple : </i>« site grpnfo ftp nouvelle_description »<br><br>Cette action modifiera la description du groupe « ftp » par<br>« nouvelle_description ».<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Afficher votre ligne actuelle d'état"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Afficher les plus gros téléchargeurs"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Afficher les plus gros téléchargeurs"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Afficher les plus gros téléchargeurs appartenant au groupe"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros téléchargeurs.<br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Afficher les plus gros émetteurs"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Afficher les plus gros émetteurs appartenant au groupe"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros émetteurs.<br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Afficher les plus gros émetteurs de la journée"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Afficher les plus gros émetteurs de la journée appartenant au groupe"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros émetteurs de la journée.<br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Afficher les plus gros téléchargeurs de la journée"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Afficher les plus gros téléchargeurs de la journée appartenant au groupe"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros téléchargeurs de la journée. <br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Afficher les plus gros émetteurs du mois"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Afficher les plus gros émetteurs du mois appartenant au groupe"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros émetteurs du mois. <br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Afficher les plus gros téléchargeurs du mois"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Afficher les plus gros téléchargeurs du mois appartenant au groupe"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros téléchargeurs du mois. <br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Afficher les plus gros utilisateurs"
+
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Afficher les plus gros utilisateurs"
+
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Afficher les plus gros utilisateurs appartenant au groupe"
+
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros utilisateurs. <br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Afficher les plus gros émetteurs de la semaine"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Afficher les plus gros émetteurs de la semaine appartenant au groupe"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros émetteurs de la semaine. <br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Afficher les plus gros téléchargeurs de la semaine"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Afficher les plus gros téléchargeurs de la semaine appartenant au groupe"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Afficher les plus gros téléchargeurs de la semaine. <br><group> est également optionnel. En le spécifiant, vous n'afficherez <br>que les utilisateurs lui appartenant, mais l'utilisateur effectuant cette <br>opération a besoin d'un accès spécial à « glftpd.conf ». Ceci est <br>contrôlé par le paramètre « -grpstats »."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Afficher le trafic sur le serveur"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Afficher le trafic sur le serveur<br>Afficher le total d'émission / réception de tous les utilisateurs des sections"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Afficher le groupe émettant le plus"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Afficher le groupe émettant le plus<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Afficher le groupe émettant le plus ce mois-ci"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Afficher le groupe émettant le plus ce mois-ci<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Afficher le groupe téléchargeant le plus ce mois-ci"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Afficher le groupe téléchargeant le plus ce mois-ci<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Afficher le groupe émettant le plus cette semaine"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Afficher le groupe émettant le plus cette semaine<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Afficher le groupe téléchargeant le plus cette semaine"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Afficher le groupe téléchargeant le plus cette semaine<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Afficher le groupe téléchargeant le plus"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Afficher le groupe téléchargeant le plus<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Charger le fichier utilisateur dans la mémoire de votre processus, afin de devenir cet utilisateur."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Charger le fichier utilisateur dans la mémoire de votre processus, afin de <br>devenir cet utilisateur (bien que certaines choses, comme le dossier <br>personnel, ou l'affichage de « site who display » ne changeront pas). <br>La permission « -emulate » est nécessaire dans le fichier de <br>configuration. Cette action a été créée pour les scripts spécifiques, afin <br>d'agir comme certains utilisateurs sans avoir besoin de connaître leur <br>mot de passe et de s'authentifier à leur place. La plupart des <br>opérateurs de site ne trouveront aucun intérêt à cette opération. <br><br>Remarque : Ceci n'est pas une véritable émulation, et vous ne devriez <br>pas l'utiliser pour des choses importantes. Certaines actions ne <br>fonctionneront pas, d'autres assez mal. La seul façon de s'effectuer <br>une véritable émulation est de se connecter avec cet utilisateur. <br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Afficher l'écran d'aide"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Afficher l'écran d'aide<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Afficher les échecs de connexions"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Afficher les échecs de connexions <br> <br>Cette action affiche le fichier « /glftpd/ftp-data/logs/login.log » <br>Consultez l'aide sur « site syslog » pour la syntaxe utilisée. <br>"
+
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Afficher les sorties récentes"
+
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Afficher les sorties récentes<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Vérifier la dernière connexion d'un utilisateur"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Vérifier la dernière connexion d'un utilisateur <br> <br><i>Exemple : </i>« site seen Archimede » <br> <br>Cette commande affichera la date de la dernière connexion de l'utilisateur « Archimede ». <br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Affiche directement le fichier d'utilisateurs"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Affiche directement le fichier d'utilisateurs<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Affiche des informations détaillées sur les utilisateurs connectés"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Affiche des informations détaillées sur les utilisateurs connectés<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Envoyer les signets à"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Aucun contact disponible>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Désactivé dans cette version de KDE>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Vous êtes sur le point d'envoyer vos signets KFTPGrabber à <b>%1</b>. Ils peuvent contenir des mots de passes ou des certificats X509 personnels et l'envoi de vos signets peut compromettre leurs confidentialités.<br><br>Voulez-vous vraiment effectuer l'envoi ?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Envoyer les signets"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Ce serveur est un démon FTP distribué"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Voulez-vous vraiment supprimer ce(s) fichier(s) ?"
+
+#~ msgid "Date"
+#~ msgstr "Date"
+
+#~ msgid "Permissions"
+#~ msgstr "Permissions"
+
+#~ msgid "Owner"
+#~ msgstr "Propriétaire"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Impossible d'ouvrir le dossier « %1 »."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Ce dossier contient 1 fichier.\n"
+#~ "Ce dossier contient %n fichiers."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "L'affichage de l'intégralité peut prendre un certain temps."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Voulez-vous vraiment effectuer cette opération ?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "En transfert..."
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Général"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Ajouter un nouveau motif"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Voulez-vous vraiment supprimer ce motif ?"
+
+#~ msgid "&Other"
+#~ msgstr "&Divers"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Renommer les fichiers en minuscules a&vant de les télécharger"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Co&loration"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "&Ajouter un motif..."
+
+#~ msgid "E&dit..."
+#~ msgstr "&Modifier ..."
+
+#~ msgid "Re&move"
+#~ msgstr "Su&pprimer"
+
+#~ msgid "E&nabled"
+#~ msgstr "A&ctivé"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Liste de pri&orités"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Motif prioritaire :"
+
+#~ msgid "Patterns"
+#~ msgstr "Motifs"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "&Ajouter un motif"
+
+#~ msgid "&Low"
+#~ msgstr "F&aible"
+
+#~ msgid "Value:"
+#~ msgstr "Valeur :"
+
+#~ msgid "&Skip"
+#~ msgstr "&Ignorer"
+
+#~ msgid "&High"
+#~ msgstr "É&levé"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Paramètres de la liste de priorités"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "&Activer la liste de priorités"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "I&gnorer les fichiers vides"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Appli&quer cette liste de priorités aux dossiers"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Ne pas insérer dans la lis&te les fichiers ignorés"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Placer les dossiers dans la liste avant les fichiers"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "Une liste de motifs de fichiers à surligner lors de la navigation."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Surligner les fichiers de la liste de filtres."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Passer les fichiers à ignorer de la liste."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Passer les fichiers vides."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Appliquer la liste des fichiers ignorés aux dossiers."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Ne pas placer dans la liste d'attente les fichiers ignorés."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Mettre les dossiers dans la liste avec les fichiers."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Mettre en minuscules tous les fichiers téléchargés."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "&Broyer"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "&Définir un filtre..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Effacer le filtre"
+
+#~ msgid "Filter"
+#~ msgstr "Filtre"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Saisissez le filtre :"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "Éditeur de signets FTP"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "Paramètres TLS/SSL"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Mode de transfert :"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - privé (intégrité et anonymat)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - confidentialité (anonymat sans intégrité)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - sécurisé (intégrité sans anonymat)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - clair (pas de SSL)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Échec de connexion (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Transfert:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Down: %1/s Up: %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "Lecture SFTP de la liste de fichiers du dossier..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "Dossier SFTP changé pour « %1 »"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Démarrage du téléchargement du fichier « %1 »"
+
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr ""
+#~ "1 octet transféré.\n"
+#~ "%n octets transférés."
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Démarrage de l'envoi du fichier « %1 »"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "Échec du transfert FXP."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Échec de la configuration du mode de protection, retour vers la connexion non chiffrée."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Hôte « %1 » inconnu"
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Impossible d'établir une connexion SSL implicite."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Connexion SSL établie implicitement."
+
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "Deuxième échec du mode passif, désactivation de l'utilisation de PASV."
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Lecture de la liste des fichiers du dossier terminée."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Impossible de se connecter au serveur."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Déconnecté du serveur."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "Modes SSL sur la source et le serveur destination incompatibles."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "Impossible d'établir la connexion."
+
+#~ msgid "Error reading file."
+#~ msgstr "Erreur de lecture du fichier."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "Impossible de se connecter au serveur."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Ce dossier n'est pas dans le cache."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Impossible d'ouvrir le dossier."
+
+#~ msgid "View &Local"
+#~ msgstr "Vue &locale"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Mode &Hors-ligne"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "Cette URL n'est pas dans le cache."
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Ce dossier n'est pas dans le cache."
+
+#, fuzzy
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr "Temps d'expiration du transfert de données (en sec.) :"
+
+#~ msgid "Should the cache be used when browsing the sites."
+#~ msgstr "Utilisation du cache lors de l'exploration de sites."
diff --git a/translations/ga/Makefile.am b/translations/ga/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ga/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ga/messages/Makefile.am b/translations/ga/messages/Makefile.am
new file mode 100644
index 0000000..6c2ce5e
--- /dev/null
+++ b/translations/ga/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ga
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ga/messages/kftpgrabber.po b/translations/ga/messages/kftpgrabber.po
new file mode 100644
index 0000000..b37d2f9
--- /dev/null
+++ b/translations/ga/messages/kftpgrabber.po
@@ -0,0 +1,3233 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: extragear-network/kftpgrabber.po\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2005-05-13 07:57-0500\n"
+"Last-Translator: Kevin Patrick Scannell <scannell@SLU.EDU>\n"
+"Language-Team: Irish <ga@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "ina bhfuil"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "nach bhfuil ann"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Comhadlann"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "bearta"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Roghnaigh gníomh, le do thoil."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Tosaíocht:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Íosluchtaigh"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Uasluchtaigh"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Ainm comhaid"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Cineál Iontrála"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Méid"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Athraigh tosaíocht"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr ""
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Iompórtáil gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Iompórtáil KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Iompórtáil NcFtp"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Tá an comhad ann"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - Cliant FTP le haghaidh KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Príomhfhorbróir"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Forbróir"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Cód LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Cód otpCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Dearadh an deilbhín"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Tástáil agus dífhabhtú"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr ""
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Theip ar nascadh leis an bhfreastalaí."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Theip ar logáil isteach"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Níl cead agat."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Ní féidir an comhad a oscailt chun scríobh ann."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Theip ar an aistriú ar fáth éigin."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Ní féidir nasc SSH a dhéanamh (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Ag logáil isteach..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Theip ar logáil isteach."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "D'éirigh le fíordheimhniú le heochair phoiblí."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Ní féidir cainéal SFTP a thúsú."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Ní féidir SFTP a thúsú."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Nasctha."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Ag nascadh..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Ag dul i dteagmháil le %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Tobscortha."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Á Aistriú..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Comhad '%1' á íosluchtú..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Comhad '%1' á uasluchtú..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Á bhaint..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Á athainmniú..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Mód á athrú..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Theip ar nascadh."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Theip ar nascadh (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Ag feitheamh le nasc sonraí ar phort %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Nasc sonraí déanta."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Comhadlann á cruthú..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Comhad '%1' á aistriú..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Dínasctha."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Nasc imithe thar am."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Díomhaoin."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr ""
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Comhadlanna á scanadh go hathchúrsach..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Ag feitheamh..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Á triail arís (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Méid/Stampa Ama"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Céanna"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Níos Sine"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Níos Nuaí"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Níos Lú"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Níos Mó"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Ná bac leis"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Forscríobh"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Lean ar aghaidh"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Athainmnigh"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Fiafraigh díom"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Log (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Seisiún Logánta"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr ""
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Seisiún"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Dún an Seisiún"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Nas&c Gasta..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "Seisiún &Nua"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "Taobh C&lé"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Tao&bh Deas"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Mód Ais&trithe (Uathoibríoch)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Dénártha"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Uathoibríoch"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Mód Ais&trithe (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Mód Ais&trithe (Dénártha)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Roghnaigh..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Gan ainm"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Aistrigh"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Cur Síos"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Atosaigh an tAistriú"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "Cuir &Leis an gCiú"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Cuir Uile Leis an gCiú"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Bain"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Bain Uile"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "An bhfuil tú cinnte gur mian leat an t-aistriú teipthe seo a bhaint?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "An bhfuil tú cinnte gur mian leat gach aistriú teipthe a bhaint?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Foirm1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Patrún Nua"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Patrún ainm comhaid:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Dath:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Nasc Gasta"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "óstainm"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "port bailí"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "d'ainm úsáideora"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "d'fhocal faire"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " agus"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Iontráil "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Suíomhanna i nGar Duit"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Patrún"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Dath"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Cuir patrún leis"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Cumasaithe"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Aibhsiú"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Níl ar fáil fós.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Ná Bac Leis an Liosta"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Eisínteachtaí ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Ginearálta"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Aistrithe"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Taispeáin"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Gníomhartha"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Scagairí"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Fíoraitheoir shuim seiceála"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Suim sheiceála"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr ""
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Cumasaíodh an &scagaire"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Gan scagairí."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Suas"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Síos"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Athainmnigh..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Nua"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Athainmnigh Riail"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Coinníollacha"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Cuardaigh & Athchuir"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Úsáid bhandaleithead"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Níos Mó"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Níos Lú"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Glan"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "moillithe"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "ag rith"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Ag feitheamh le nasc..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Scagaire: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Ainm"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Foinse"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Ceann Scríbe"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Dul chun cinn"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Luas"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "Am Measta Críche"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Níl aon chomhad agat sa chiú."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Síos"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "Suas"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Snáitheanna"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "To&saigh an tAistriú"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Tobscoir an tAistriú"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "B&ain Uile"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Bog S&uas"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Bog &Síos"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Luchtaigh Ciú Ó Chomhad"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Sábháil Ciú i gComhad"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "T&osaigh"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Sos"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Cuir &Aistriú Leis..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Cuardaigh && Athchuir..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Taispeáin &Scagaire"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Suíomh"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+"An bhfuil tú cinnte gur mian leat an comhad/na comhaid ciúáilte a bhaint?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "An bhfuil tú cinnte gur mian leat gach comhad ciúáilte a bhaint?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Luchtaigh Ciú"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Snáithe %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "díomhaoin"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "dínasctha"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "ag nascadh"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "á aistriú"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Stádas"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Gan leabharmharcanna."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nua..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Athainmnigh"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Cruthaigh Fochatagóir..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Dúblach"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Suíomh:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Ainm na Catagóire"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Athainmnigh catagóir:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Ainm Nua Catagóire"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Catagóir nua:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Freastalaí nua"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Freastalaí Nua"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "An bhfuil tú cinnte gur main leat an chatagóir seo a bhaint?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "An bhfuil tú cinnte gur main leat an freastalaí seo a bhaint?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Ní féidir an breiseán roghnaithe iompórtála a luchtú."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Níl an comhad roghnaithe ann, nó níl sé inléite."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr ""
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Eagar..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Socruithe SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Iompórtáil..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Easpórtáil..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Eagarthóir na Leabharmharcanna FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Easpórtáil Leabharmharcanna"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Tobscoir"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Airíonna"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Léirscrios"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Roghanna &Scagaire"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Ais&trigh"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Ciúáil Aistriú"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Cruthaigh Comhadlann..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Oscail comhad"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Cinntigh..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "Gníomhartha &Eile"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Taispeáin Comhaid && Comhadlanna &Folaithe"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Oscail an chomhadlann reatha i &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Cuir míreanna &roghnaithe i gcomparáid"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Cuir comha&dlanna i gcomparáid"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Seol O&rdú Amh"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Athraigh Suíomh"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Nasc Gasta..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Nasc Le"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Dínasc"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Athraigh an t&Ionchódú Cianda"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Ar mhaith leat an nasc reatha a bhriseadh?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "An bhfuil tú cinnte gur mian leat an comhad seo a LÉIRSCRIOSADH?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Léirscrios Comhad"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"An bhfuil tú cinnte gur mian leat an mhír seo a scriosadh?\n"
+"An bhfuil tú cinnte gur mian leat an dá mhír seo a scriosadh?\n"
+"An bhfuil tú cinnte gur mian leat na %n mhír seo a scriosadh?\n"
+"An bhfuil tú cinnte gur mian leat na %n mír seo a scriosadh?\n"
+"An bhfuil tú cinnte gur mian leat na %n mír seo a scriosadh?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Scrios Comhaid"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Ná bac le '%1'"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Tosaíocht '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Cruthaigh Comhadlann"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Ainm na comhadlainne:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Seol Ordú Amh"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Ordú:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Ginearálta"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Cianfhillteán"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Anaithnid"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Cineál:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Suíomh:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Méid:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Cruthaithe:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Ceadanna"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Ceadanna Rochtana"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Aicme"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Taispeáin\n"
+"Iontrálacha"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Léigh"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Scríobh\n"
+"Iontrálacha"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Scríobh"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Téigh Isteach"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Rith"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Speisialta"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Úsáideoir"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grúpa"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Eile"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Socraigh Aitheantas an Úsáideora"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Socraigh Aitheantas an Ghrúpa"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Greamaitheach"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+"Cuir na hathruithe i bhfeidhm ar gach fo-fhillteán agus ar a n-inneachar"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Fréamhchomhadlann:"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Conair: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Tá an nasc seo criptithe ag SSH. Níl aon fhaisnéis teastais ar fáil faoi "
+"láthair."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Roghanna Scagaire"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Scag Comhadlanna"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Scag Naisc Shiombalacha"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Cásíogair"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "Túsaíodh clár logála <b>KFTPGrabber</b>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Ní féidir an comhad a oscailt chun scríobh ann."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Á Chur i dTráidire an Chórais"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Tá aistriú amháin ag rith faoi láthair.\n"
+"Tá dhá aistriú ag rith faoi láthair.\n"
+"Tá %n aistriú ag rith faoi láthair.\n"
+"Tá %n n-aistriú ag rith faoi láthair.\n"
+"Tá %n aistriú ag rith faoi láthair."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"An bhfuil tú cinnte gur mian leat scor?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Suíomhanna FTP i nGar Dom"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Suímh i KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Cuir Leabharmharcanna in Eagar..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Íosluchtú: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Uasluchtú: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Ciú"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Aistrithe Teipthe"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Suíomhanna i nGar Dom"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Snáitheanna"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Trácht"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Cóip de"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Theip ar dhíchriptiú"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "F&orscríobh Leabharmharcanna"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<Níl DNSSD Ar Fáil>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Séamus Ó Ciardhuáin,Kevin Scannell"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "seoc at iolfree dot ie,scannell at slu dot edu"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Taispeá&in"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Brabhsálaí Comhad"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Taispeáin comhaid agus comhadlanna &folaithe"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Tai&speáin méid na comhadlainne"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Taispeáin barra taoibh ar chlé"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Cuardaigh Ar"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Ceann Scríbe:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Foinse:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Eolas faoin Fhreastalaí"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Ainm an fhreastalaí:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Óstríomhaire:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Focal Faire:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Ainm úsáideora:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Ionadaigh Le"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Treoraí Iompórtála Leabharmharcanna"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Céim a haon: <b>Roghnaigh Breiseán Iompórtála</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Íomhá"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Breiseáin iompórtála le fáil:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Céim a dó: <b>Roghnaigh Comhad Leabharmharcanna le hIompórtáil</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Céim a trí: <b>Leabharmharcanna á nIompórtáil...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Dul chun cinn na hiompórtála:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Cuma"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Cló && Dathanna"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Cló:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Aschur"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Aschomhad:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Foinse:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Ceann Scríbe:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Cineál aistrithe:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "&Nasc"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP an naisc gníomhaigh"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/óstainm:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Teorainn luais"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Íosluchtú (kB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Uasluchtú (kB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Spás &Diosca"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Eatramh (soic):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Snáithe&anna"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Eile"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Gabh thar comhadlanna &folmha le linn ciúála"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "AiríonnaSuímhftp"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Óstainm:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Prótacal:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP trí TLS/SSL (follasach)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP trí TLS/SSL (intuigthe)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP trí SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Lipéad an tsuímh:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Comhadlann chianda:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Comhadlann logánta:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "Logáil isteach g&an ainm"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "C&asta"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Ionchódú Freastalaí"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Ionchódú:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Atriail"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "Ei&sínteachtaí ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Cuir Eisínteacht Leis"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Eisínteacht:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Eisínteacht"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Naisc is déanaí"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Roghnaigh nasc:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Cuir an URL iomlán isteach sa bhosca seo"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Iontráil ainm an óstríomhaire FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Logáil &isteach gan ainm"
+
+# ticeáil or seiceáil?
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Iontráil ainm úsáideoir an chuntais"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Iontráil focal faire an chuntais"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Cuir leis na lea&bharmharcanna"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Casta"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Socruithe Naisc Sonraí"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Mód:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Criptigh an cainéal sonraí i gcónaí"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Ná criptigh an cainéal sonraí"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Teastas X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Úsáid an teastas SSL seo a leanas le linn nasctha"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Conair:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "Seol&adh Ríomhphoist"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "Ú&sáid seoladh ríomhphoist ón lárionad rialaithe"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "R-phost:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Tosú agus Scor"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Taisp&eáin splancscáileán ag am tosaithe"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Taispeáin deilbhín i dtráidire an &chórais"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Réamhshocruithe an tSuímh"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Cr&iptigh comhad na leabharmharcanna"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Tai&speáin suímh ó KWallet i measc na leabharmharcanna"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Fógairt"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Balúin"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Comhad:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "neamhní"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Liosta comhad"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Gan phróiseáil"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "OK"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Gan aimsiú"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Teipthe"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Méid na príomhfhuinneoige."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Ionad na príomhfhuinneoige ar an scáileán."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Stádas criptithe chomhad na leabharmharcanna."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Comhadlann logánta réamhshocraithe."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Ionchódú réamhshocraithe an tsuímh."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Dath na n-orduithe a sheoltar chuig an bhfreastalaí."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Dath na bhfreagraí a fhaightear ón fhreastalaí."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Dath na dteachtaireachtaí earráide."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Dath na dteachtaireachtaí stádais."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Taispeáin méid na comhadlainne."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Taispeáin barra taoibh ar chlé."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Príomh-Roghchlár"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barra Uirlisí Leabharmharcanna"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Níor sonraíodh ainm úsáideora ar '%1'."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Earráid Le Linn Nasctha"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "Socruithe Taispeána"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+D"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "KFTPQuickConnectLayout"
+
+#~ msgid "Webpage design"
+#~ msgstr "Dearadh an leathanaigh Gréasáin"
+
+#~ msgid "Command"
+#~ msgstr "Ordú"
+
+#~ msgid "What's this?"
+#~ msgstr "Cad É Seo?"
+
+#~ msgid "Server Management"
+#~ msgstr "Bainisteoireacht na bhFreastalaithe"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Íosluchtú: %1 MB Uasluchtú: %2 MB<br>Creidmheas: %3 MB Cóimheas: %4"
+
+#~ msgid "Username"
+#~ msgstr "Ainm Úsáideora"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Iontráil ainm úsáideora nó brúigh `Cealaigh'"
+
+#~ msgid "Group name"
+#~ msgstr "Ainm grúpa"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Iontráil grúpa nó brúigh `Cealaigh'"
+
+#~ msgid "Description name"
+#~ msgstr "Cur síos"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Iontráil cur síos nó brúigh Cealaigh"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Ní ionann na focail fhaire"
+
+#~ msgid "Optional"
+#~ msgstr "Roghnach"
+
+#~ msgid "Password retype:"
+#~ msgstr "Iontráil an focal faire arís:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Seol &Amhordú..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Taispeáin d'aga díomhaoin"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Socraigh d'aga díomhaoin (do sheisiún amháin)"
+
+#~ msgid "This will change your password"
+#~ msgstr "Athróidh sé seo d'fhocal faire"
+
+#~ msgid "Display the group info"
+#~ msgstr "Taispeáin eolas faoin ghrúpa"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Taispeáin eolas faoin ghrúpa<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Taispeáin ailiasanna reatha"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Taispeáin leagan reatha glftpd"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Taispeáin leagan reatha glftpd<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Taispeáin na húsáideoirí atá ar líne faoi láthair"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Taispeáin na húsáideoirí atá ar líne faoi láthair<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Taispeáin an scáileán fáilte"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Taispeáin an scáileán fáilte<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Taispeáin an t-am reatha ar an suíomh"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Taispeáin an t-am reatha ar an suíomh<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Scrios úsáideoir; is féidir é a athchóiriú le READD"
+
+#~ msgid "Change user's password"
+#~ msgstr "Athraigh focal faire an úsáideora"
+
+#~ msgid "Readd user"
+#~ msgstr "Cuir úsáideoir ar ais"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Taispeáin na húsáideoirí / Taispeáin mionsonraí faoi úsáideoir"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Taispeáin na grúpaí atá ar fáil"
+
+#~ msgid "Add a new group"
+#~ msgstr "Cuir grúpa nua leis"
+
+#~ msgid "Delete a group"
+#~ msgstr "Scrios grúpa"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Taispeáin scáileán cabhrach"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Taispeáin scáileán cabhrach<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Seol Leabharmharcanna Chuig"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Níl aon teagmháil ar fáil>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Díchumasaithe sa leagan seo de KDE>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Seol Leabharmharcanna"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "An bhfuil tú cinnte gur mian leat an comhad/na comhaid seo a scriosadh?"
+
+#~ msgid "Date"
+#~ msgstr "Dáta"
+
+#~ msgid "Permissions"
+#~ msgstr "Ceadanna"
+
+#~ msgid "Owner"
+#~ msgstr "Úinéir"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Ní féidir comhadlann '%1' a oscailt."
+
+#~ msgid "Are you sure?"
+#~ msgstr "An bhfuil tú cinnte?"
+
+#~ msgid "TransferSettings"
+#~ msgstr "SocruitheAistrithe"
+
+#~ msgid "Alt+E"
+#~ msgstr "Alt+F"
+
+#~ msgid "GeneralSettings"
+#~ msgstr "SocruitheGinearálta"
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+C"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Cuir Patrún Nua Leis"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "An bhfuil tú cinnte go dteastaíonn uait an patrún seo a bhaint?"
+
+#~ msgid "&Other"
+#~ msgstr "&Eile"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Ai&bhsiú"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "Cuir P&atrún Leis..."
+
+#~ msgid "E&dit..."
+#~ msgstr "Ea&gar..."
+
+#~ msgid "Re&move"
+#~ msgstr "&Bain"
+
+#~ msgid "E&nabled"
+#~ msgstr "Cu&masaithe"
+
+#~ msgid "Patterns"
+#~ msgstr "Patrúin"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "Cuir P&atrún Leis"
+
+#~ msgid "&Low"
+#~ msgstr "Ísea&l"
+
+#~ msgid "Value:"
+#~ msgstr "Luach:"
+
+#~ msgid "&Skip"
+#~ msgstr "Ná bac lei&s"
+
+#~ msgid "&High"
+#~ msgstr "&Ard"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "&Cumasaigh liosta tosaíochta"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "&Socraigh Scagaire..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Bánaigh Scagaire"
+
+#~ msgid "Filter"
+#~ msgstr "Scagaire"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Iontráil scagaire:"
+
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "KFTPBookmarkEditorTLSWidget"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "Socruithe TLS/SSL"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Mód aistrithe:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - príobháideach (sláine agus príobháideacht)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - rúnda (príobháideacht gan sláine)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - slán (sláine gan phríobháideacht)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - glan (gan SSL)"
+
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Theip ar nascadh sonraí (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Aistrigh:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Íos: %1/s Uas: %1/s"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "Theip ar an aistriú FXP."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Óstríomhaire anaithnid '%1'."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Ní féidir nasc a dhéanamh leis an bhfreastalaí."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Briseadh an nasc leis an fhreastalaí."
+
+#~ msgid "Error reading file."
+#~ msgstr "Earráid agus comhad á léamh."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "Ní féidir nasc a dhéanamh leis an bhfreastalaí."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Níl an chomhadlann sa taisce."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Ní féidir an chomhadlann a oscailt."
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Mód &As Líne"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "Níl an URL seo sa taisce."
+
+#~ msgid "Cache"
+#~ msgstr "Taisce"
+
+#~ msgid "Alt+D"
+#~ msgstr "Alt+C"
+
+#~ msgid "Error to find %1 file"
+#~ msgstr "Earráid agus comhad %1 á aimsiú"
+
+#~ msgid "Alt+Q"
+#~ msgstr "Alt+L"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+S"
+
+#~ msgid "Boo&kmarks"
+#~ msgstr "&Leabharmharcanna"
+
+#~ msgid "Syntax Error"
+#~ msgstr "Earráid Chomhréire"
+
+#~ msgid "Alt+H"
+#~ msgstr "Alt+A"
+
+#~ msgid "Unknown (FXP)"
+#~ msgstr "Anaithnid (FXP)"
+
+#~ msgid "&Threads"
+#~ msgstr "Snái&theanna"
+
+#~ msgid "Preferences"
+#~ msgstr "Sainroghanna"
+
+#~ msgid "General Preferences"
+#~ msgstr "Sainroghanna Ginearálta"
+
+#~ msgid "User name"
+#~ msgstr "Ainm úsáideora"
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/kftpgrabber.po b/translations/gl/messages/kftpgrabber.po
new file mode 100644
index 0000000..555f3b1
--- /dev/null
+++ b/translations/gl/messages/kftpgrabber.po
@@ -0,0 +1,3512 @@
+# translation of kftpgrabber.po to Galician
+#
+# mvillarino <mvillarino@users.sourceforge.net>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-09-02 13:09+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "a conectar"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Cartafol"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Prioridade"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Obter"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Enviar"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Nome do ficheiro"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Tamaño"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "Mu&dar o Sítio"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Destino"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Importar de gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Importar de KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Importar de NcFTP"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Todas as transferéncias na cola finalizaron."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "O Ficheiro Existe"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - un cliente de FTP para KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Un URL adicional ao que se conectar"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Desenvolvente lider"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Desenvolvente"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Código de LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Código de otpCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Código do aviso KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Elemento do gráfico de tránsito"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Deseño dos ícones"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Probas e depurazón"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Código do procesador de cartafoles"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "A transferéncia dos seguintes ficheiros rematou:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "A conexón co servidor estragou-se."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Fallou a autenticazón no servidor"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Non foi posíbel atopar o ficheiro de orixe."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Negou-se o permiso."
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Non foi posíbel aceder ao ficheiro para escrita."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "A transferéncia fallou por algunha razón."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"A transferéncia dos seguintes ficheiros <b>foi interrompida</b> "
+"porque non hai espazo de abondo en \"%1\":"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Non foi posíbel estabelecer a conexón SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "A aceder..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Conectado co servidor, a tentar autenticar-se..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "A autenticazón fallou."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "A autenticazón interactiva co teclado tivo éxito."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "A autenticazón con chave pública tivo éxito."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Non foi posíbel inicializar a canle SFTP."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Non foi posíbel inicializar SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Conectado."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "A conectar..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "A conectar con %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Interrompido."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "A usar a lista do cartafol na caché."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "A obter a lista do cartafol..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "A transferir..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "A obter o ficheiro \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "A enviar o ficheiro \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "A borrar..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "A mudar o nome..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "A modificar o modo..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "A conexón estragou-se."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+#, fuzzy
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"A negociazón de SSL tivo éxito. A conexón está asegurada con SSL de %1 bits."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "A negociazón de SSL fallou. A autenticazón foi interrompida."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "O pedido de negociazón de SSL fallou. A autenticazón foi interrompida."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "A negociazón de SSL fallou. A conexón foi interrompida."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Conectado co servidor; á espera da mensaxe de benvidas..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Non foi posíbel estabelecer a conexón (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Família de enderezos incompatíbel para PORT, pero EPRT non está soportado, a "
+"interromper!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "A estabelecer a conexón de datos con %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Non foi posíbel estabelecer un socket de escoita."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Á espera da conexón de datos no porto %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "A conexón de datos foi estabelecida."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "A canle de datos está asegurado con SSL de %1 bits."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"A negociazón de SSL para a canle de datos fallou. A interromper a "
+"transferéncia."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "A transferéncia está completa."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "A criar o cartafol..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "A enviar o ficheiro \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "A transmitir sinal de keep-alive..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Desconectado."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "A conexón expirou."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Ocioso."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Pesquisa completa."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "A iniciar a pesquisa recursiva do cartafol..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "A esperar %1 segundos antes de conectar de novo..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "A esperar..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "A repetir a conexón (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "A repetir a conexón..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "A repetizón foi interrompida."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Aczóns no Caso de que o Ficheiro Exista (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Tamaño/Hora"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Igual"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Máis Antigo"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Máis Recente"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Menor"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Maior"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Ignorar"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Sobrescreber"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Continuar"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Mudar o Nome"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Perguntar"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Rexisto (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Sesión Local"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Rexisto"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "A conexón con %1 foi estabelecida con éxito."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Indique o contrasinal da sua chave privada."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sesión"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Polo menos unha sesión debe permanecer aberta de cada lado."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Termine todas as transferéncias antes de pechar a sesión."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "Esta sesión está conectada. Está seguro de que desexa desconectar?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Pechar a Sesión"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Cone&xón Rápida..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nova Sesión"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Lado Esquerdo"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Lado Di&reito"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Modo de &Transferéncia (Auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binário"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Modo de &Transferéncia (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Modo de &Transferéncia (Binário)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Escoller..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Sen nome"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Transferéncia"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Descrizón"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Non hai transferéncias estragadas."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Reiniciar a Transferéncia"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Engadir á Cola"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Engadir todo á cola"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "Bo&rrar"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Borrar todo"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Está seguro de que desexa borrar esta transferéncia estragada?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Está seguro de que desexa borrar todas as transferéncias estragadas?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Novo Padrón"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Padrón do nome do ficheiro:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Cor:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Conexón Rápida"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "un nome de máquina"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "un porto válido"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "o seu nome de usuário"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "o seu contrasinal"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " e"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Por favor introduza"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Por favor indique o contrasinal de descodificazón do certificado X509."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Sítios Próximos"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Non hai publicado nengun site."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Padrón"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Cor"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Engadir un padrón"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Activado"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Realce"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Ainda non foi implementado.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Ignorar a Lista"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Extensións ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Xeral"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Transferéncias"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Visualizazón"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Aczóns"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtros"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Verificazón de integridade"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Suma de verificazón"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verificazón completa!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Non foi posíbel abrir o ficheiro coas sumas de verificazón ou ten un formato "
+"incorrecto!"
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Nome do ficheiro"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filtros"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Obter"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "A mudar o nome..."
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Máis Recente"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Mudar o Nome"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Cone&xón"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Procurar e Remprazar"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Utilizazón do ancho de banda"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "parado"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "a correr"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Á espera de conexón..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtro: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Orixe"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Destino"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Progreso"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Velocidade"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Non ten nengun ficheiro na cola."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Obter"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Fios"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Iniciar a Tran&sferéncia"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Interromper &a Transferéncia"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Borrar &todo"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "S&ubir"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "&Baixar"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "S&ubir"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Modifi&car a Informazón da Transferéncia"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Cargar a Co&la dun Ficheiro"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "Guardar a Cola nun &Ficheiro"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Iniciar"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pausa"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Engadir unha Transferéncia..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "Procurar e &Remprazar..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Mostrar o &Filtro"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Sítio"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Está seguro de que desexa borrar os ficheiros na cola de espera?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Está seguro de que desexa borrar TODOS os ficheiros na cola de espera?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Se carrega unha nova cola sobrescreberá a existente; está seguro de que desexa "
+"continuar?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Carregar a Cola"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Sesión no sítio [%1] "
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Fio %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "ocioso"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "desconectado"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "a conectar"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "a transferir"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1] "
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Estado"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Non hai fios a executar-se."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Sen favoritos."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Novo..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "Muda&r o Nome"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Criar unha Sub-Categoria..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplicar"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+"Indique o seu usuário e o contrasinal para se conectar a este servidor."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Sítio:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Nome da Categoria"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Mudar o nome da categoria:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nome Novo da Categoria"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nova categoria:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Novo servidor"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Novo Servidor"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Está seguro de que desexa borrar esta categoria?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Está seguro de que desexa borrar este servidor?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Non foi posíbel cargar a extensión de importazón escollida."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "O ficheiro escollido non existe ou non pode ser lido."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "A importazón de favoritos terminou."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Editar..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Configurazón de SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importar..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exportar..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Editor de Favoritos de FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+" <qt>Está a piques de exportar os seus favoritos de KFTPGrabber. Poden conter "
+"contrasinais ou certificados X509 importantes: o envio dos seus favoritos pode "
+"comprometer a sua seguridade."
+"<br>"
+"<br>Está seguro?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Exportar os Favoritos"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Interromper"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Mo&strar a Vista en Árbore"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Propriedades"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "De&struir"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Opzóns do Filtro"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "Unha lista das prioridades dos ficheiros ao colocá-los na cola."
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Transferéncia"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Pór a Transferéncia na &Cola"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Criar o directório..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Abrir un ficheir&o"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verificar..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Máis Aczóns"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Exportar a Lista do cartafol..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Mostrar os Fic&heiros e cartafoles ocultos"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Filtrar Cartafoles"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Enviar un Comando en Bruto"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "Mu&dar o Sítio"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Con&exón Rápida..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Conectar con"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Desconectar"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Mudar a Codificazón R&emota"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Desexa quebrar a conexón actual?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Está seguro de que desexa DESTRUIR este ficheiro?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Destruir o Ficheiro"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Borrar o Ficheiro"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Ignorar"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Prioridade"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Criar o cartafol"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Nome do cartafol:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Enviar un Comando en Bruto"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Comando:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Exportar a Lista do cartafol"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Xeral"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Cartafol remoto"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tipo:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Localizazón:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Tamaño:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Criado:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Permisos"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Permisos de Aceso"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Clase"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Mostrar os\n"
+"Itens"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Ler"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Escreber os\n"
+"Itens"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Escreber"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Entrar"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Exec"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Especial"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Usuário"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupo"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Outros"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Trocar o UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Trocar o GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Pegoñento"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Aplicar os cámbios a todos os subcartafoles e ao seu contido"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Cartafol raiz"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Rota: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Esta é unha conexón cifrada con SSL. Non hai disponíbel informazón do "
+"certificado."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Opzóns do Filtro"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Filtrar Cartafoles"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Filtrar Ligazóns Simbólicas"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Sensíbel á capitalizazón"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "O rexisto de <b>KFTPGrabber</b> iniciou-se.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Non foi posíbel aceder ao ficheiro para escrita."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Non foi posíbel encontrar o ficheiro XML que descrebe a GUI %1. Verifique "
+"que instalou a aplicazón correctamente! Se ten dúvidas, por pergunte en %2."
+"<br>"
+"<br><b>Atenzón:</b> A GUI actual ficará incompleta!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+" "
+"<p>Se pecha a fiestra principal manterá KFTPGrabber a correr na bandexa do "
+"sistema. Use a opzón <b>Sair</b> do menu de <b>KFTPGrabber</b> "
+"para sair da aplicazón.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "A acoplar na Bandexa do Sistema"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Hai unha transferéncia en curso.\n"
+"Hai %n transferéncias en curso."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Está seguro de que desexa saír?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Sítios FTP Perto de Min"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Sítios en KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Editar os Marcadores..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Obtenzón: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Envio: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Cola"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Transferéncias Falladas"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Sítios Perto de Min"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Fios"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Tránsito"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Copia de"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Este ficheiro de favoritos está cifrado. Indique a chave para descifrá-lo."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+" <qt>Non foi posíbel descifrar o ficheiro coa chave indicada. Desexa <b>"
+"sobrescreber</b> os favoritos cun ficheiro valeiro? "
+"<br>"
+"<br><font color=\"red\"><b>Aviso:</b> Se o sobrescrebe, todos os favoritos "
+"actuais serán perdidos.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "A Descifraxe Fallou"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "S&obrescreber os Favoritos"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Indique a chave para descifrar o ficheiro de favoritos."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Sen Servizos Publicados>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD Non disponíbel>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Non hai Sítios na KWallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Visualizazón"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Na&vegador de Ficheiros"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Mostrar os fic&heiros e cartafoles acochados"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Mostrar a árbore &de cartafoles"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"&Mostrar o tamaño do ficheiro en bytes (comute para o formato \"lexíbel\") "
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Mostrar &o dono e o grupo de cada ficheiro"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Mostrar a árbore &de cartafoles"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Mostrar o &Filtro"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Procurar e Substituir na Cola"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Se usa este diálogo, poderá facer unha substituizón en masa das rotas de "
+"orixe/destino das transferéncias na cola de espera.<b>"
+"Os cámbios non poderán ser anulados.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Que Procurar"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destino:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Orixe:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Procurar só polas transferéncias dun servidor dado"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Informazón do Servidor"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Nome do servidor:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Máquina:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Contrasinal:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Nome de Usuário:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Porto:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Substituir Por"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Asistente de Importazón de Favoritos"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Paso 1: <b>Escoller a extensión de Importazón</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Imaxe"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Escolla a extensión de importazón apropriada na lista en baixo. Cada extensión "
+"pode importar a partir dun formato diferente."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Extensións de importazón disponíbeis:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Paso 2: <b>Escoller o Ficheiro de Favoritos a Importar</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Escolla o ficheiro de favoritos de onde desexa importar os seus favoritos. Xa "
+"foi determinada unha rota por omisión polo filtro de importazón."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Rota dos favoritos:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Paso 3: <b>A Importar os Favoritos...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Por favor, espere mentres os favoritos son importados."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Progreso da importazón:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Aparéncia"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Tipos de Letra e Cores"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Tipo de letra:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Cor dos comandos do cliente:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Cor das resposta do servidor:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Cor das respostas multi-liña:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Cor das mensaxes de erro:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Cor das mensaxes de estado:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "Saí&da"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Saída para un &Ficheiro"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Guardar o rexi&sto nun ficheiro"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Ficheiro de saída:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Informazón do Servidor de Orixe"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Informazón do Servidor de Destino"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Orixe:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Destino:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Tipo de transferéncia:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Cone&xón"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP da Conexón Activa"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Obrigar a PORT/EPRT a &usar o IP configurado"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/nome da máquina:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Rango de Portos das Conexóns Activas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Usar só os portos do &rango indicado"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Porto mínimo:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Porto máximo:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Tempos Limite"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Tempo-limite da conexón de controlo (en segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Tempo-limite da transferéncia de dados (en segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Limite de Velocidade"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Recepzón (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Envio (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Es&pazo en Disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Comprobazón do Espazo Libre en Disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Parar a tra&nsferéncia se non hai espazo libre suficiente"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervalo (s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Espazo libre mínimo (MB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "&Fios"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Número de fios por sesión:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Non hai transferéncias estragadas."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Outros"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"Colocar os ficheiros na &cola (en vez de transferir) ao seren \"arrastados e "
+"soltados\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Ignorar os cartafoles va&leiros"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Confirmar as desconexóns &antes de desconectar"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Máquina:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocolo:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP sobre TLS/SSL (explícito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP sobre TLS/SSL (implícito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP sobre SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Lenda do sítio:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Cartafol remoto:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Cartafol local:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Autenticazón anónima"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Avanzado"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Desact&ivar o uso do modo pasivo ampliado"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Desactivar o uso do modo pasivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Utilizar STAT para listados de cartafoles"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Fios de Transferéncia Múltiplos"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Non usar vários fios para este sítio"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Codificazón do Servidor"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Codificazón:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Tentar de novo e &Keepalive"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Repet&ir a conexón en caso de falla"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Repetir"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Número de repetizóns (0 = infinito) :"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Atraso na repetizón:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Usar pacotes \"keepalive\" para manter a conexón aberta"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Keepalive"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Frecuéncia dos pacotes \"keepalive\" (segundos):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "E&xtensións ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Engadir unha Extensión"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Extensión:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Extensión"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Conexóns recentes"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Escolla conexón:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Indique o URL completo nesta opzón"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Indique o nome da máquina FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Autent&icazón anónima"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Verificar a autenticazón anónima"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Indique o nome do usuário da conta"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Indique o contrasinal da conta"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Engadir aos fa&voritos"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avanzado"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Configurazón da Conexón de Dados"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Modo:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Cifrar sempre o canal de dados"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Cifrar só os listados de cartafoles"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Non cifrar o canal de dados"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Certificado X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Usar o seguinte certificado de SSL ao conectar"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Rota:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "&Enderezo de Correo"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Usar o enderezo de correo do centro de controlo"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Correo electrónico:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Início e Fin"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Confirmar a saída do programa de e&xistir transferéncias activas"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Iniciar o programa minimi&zado na bandexa"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Mo&strar a pantalla inicial no inicio"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Mostrar o ícone na &bandexa"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Predefinizóns do Sítio"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "C&ifrar o ficheiro de favoritos"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Mo&strar os sítios de KWallet entre os favoritos"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Notificazón"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Notificazóns"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Mo&strar unha notificazón cando a transferéncia remate"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Só mostrar &cando a cola estivese valeira após a transferéncia"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Mostrar unha notificazón cando a repet&izón da conexón tivese éxito"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Ficheiro:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "nengun"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Lista de ficheiros"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Non procesado"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "OK"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Non achado"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Fallou"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "O tamaño da fiestra principal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "A posizón da fiestra principal na pantalla."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "O número de repetizóns por omisión para os sítios novos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "O atraso de repetizóns por omisión para os sítios novos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Se mostrar unha notificazón ao rematar algunhas aczóns."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Se debe mostrar unha notificazón tras rematar toda as transferéncias da cola."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Se debe notificar ao estabelecer con éxito unha conexón ao servidor após "
+"tentá-lo de novo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+"Se o usuário debe confirmar a saída no caso de existiren transferéncias "
+"activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "O estado de cifrado do ficheiro de favoritos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "O cartafol local por omisión."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Se a aplicazón debe ser iniciada minimizada."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Se a aplicazón debe ser iniciada minimizada."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Se a imaxe inicial debe ser mostrada ao iniciar a aplicazón."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Se o ícone da bandexa debe ser mostrado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Se os sítios de KWallet deben ser mostrados entre os favoritos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Se debe ser mostrada unha fiestra de \"confirmazón de desconexón\" cada vez que "
+"se tente desconectar."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "A codificazón por omisión do sítio."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Sítios acedidos recentemente mediante conexón rápida."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Unha lista de padróns de ficheiros para os que debe usar-se o modo ASCII na "
+"transferéncia."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Se os cartafoles valeiros deben ser ignorados."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "O tipo de letra usado na fiestra de rexisto."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "A cor dos comandos enviados ao servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "A cor das respostas do servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "A cor das respostas en varias liñas recebidas do servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "A cor das mensaxes de erro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "A cor das mensaxes de estado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Se o rexisto tamén debe ser guardado nun ficheiro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "O ficheiro onde o rexisto será guardado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Se debe ser escollido un porto do rango indicado nas transferéncias activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "O inicio do rango de portos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "A fin do rango de portos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Se debe ser sobreposto un IP ao facer transferéncias activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "O IP a enviar no caso de sobrepor o comando PORT."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Se as transferéncias deben ser postas á cola en vez de iniciadas ao usar "
+"\"arrastar e soltar\"."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Se kftpgrabber debe verificar o espazo libre e interromper a transferéncia en "
+"caso de faltar espazo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "O intervalo de verificazón do disco."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Espazo libre mínimo (en MiB) que debe estar disponíbel."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Usar o enderezo de correo global de KDE para os contrasinais anónimos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "O enderezo de correo que debe ser usado nos contrasinais anónimos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Número de fios a usar ao transferir."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+"Se o usuário debe confirmar a saída no caso de existiren transferéncias "
+"activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tempo-limite (en segundos) para a conexón de controlo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tempo-limite (en segundos) para as transferéncias de datos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Limite global de velocidade da recepzón (kbps)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Limite global de velocidade de envio (kbps)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Se a árbore de cartafoles debe estar visíbel por omisión."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Se os ficheiros acochados deben aparecer na navegazón."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Se o tamaño do ficheiro debe ser mostrado en bytes en vez de nun formato "
+"\"lexíbel\"."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Se o dono e o grupo deben ser mostrados para cada ficheiro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Mostrar a árbore &de cartafoles"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Mostrar o &Filtro"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Menu Principal"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barra de Favoritos"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Non se especificou o usuário para \"%1\"."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Erro ao conectar"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Visualizazón"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Conexón Rápida"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Non foi posíbel encontrar un programa axeitado para abrir este ficheiro!"
+
+#~ msgid "Webpage design"
+#~ msgstr "Deseño da páxina Web"
+
+#~ msgid "Command"
+#~ msgstr "Comando"
+
+#~ msgid "What's this?"
+#~ msgstr "Que é isto?"
+
+#~ msgid "Server Management"
+#~ msgstr "Xestión do Servidor"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Recebido: %1 MB Enviado: %2 MB<br>Créditos: %3 MB Proporzón: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Xanela de Comandos do Sítio"
+
+#~ msgid "Username"
+#~ msgstr "Nome do Usuário"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Indique un usuário ou prema cancelar"
+
+#~ msgid "Group name"
+#~ msgstr "Nome do grupo"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Indique un grupo ou prema cancelar"
+
+#~ msgid "Description name"
+#~ msgstr "Nome da descrizón"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Indique unha descrizón ou prema cancelar"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Os contrasinais non son iguais"
+
+#~ msgid "Optional"
+#~ msgstr "Opcional"
+
+#~ msgid "Password retype:"
+#~ msgstr "Escriba o contrasinal de novo:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Envia&r Comando en Bruto..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Mostrar o seu tempo de inactividade"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Modifica o seu tempo de inactividade (só por sesión)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Modificar o seu tempo de inactividade (só por sesión).<br>Isto configura o seu tempo de inactividade (o período de tempo no cal pode estar conectado sen<br>facer nada). O tempo máximo de inactividade é de 7 200 s.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Isto modificará o seu contrasinal"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Isto modificará o seu contrasinal.<br>Os contrasinais só poden ter 8 carácteres de longo."
+
+#~ msgid "Display the group info"
+#~ msgstr "Mostrar a informazón do grupo"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Mostrar a informazón do grupo<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Mostrar os alcumes actuais"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Mostrar os \"cdpaths\" actuais"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Mostrar a versión actual de \"glftpd\""
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Mostrar a versión actual de \"glftpd\"<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Mostrar os usuários conectados"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Mostrar os usuários que están conectados<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Mostrar a pantalla de benvida"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Mostrar a pantalla de benvida<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Mostrar a hora actual do sítio"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Mostrar a hora actual do sítio<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Mostrar as versións recentes de \"unnuked\""
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Mostrar as versións recentes de \"unnuked\"<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Borrar un usuário, pode ser lido con \"site READD\""
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Borra un usuário, pode ser lido co comando \"site READD\"<br><br><i>Exemplo:</i> site deluser Arquimedes<br><br>Isto activará a opzón DELETED (6) para o usuário \"Arquimedes\".<br>Para borrar por completo este usuário, terá que facer un \"site purge\"<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Mudar o contrasinal dun usuário"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Mudar o contrasinal dun usuário<br><i>Exemplo:</i> site chpass Arquimedes novo_contrasinal<br>Mudará o contrasinal do usuário \"Arquimedes\"<br>para \"novo_contrasinal\".<br><br>Consulte \"site passwd\" para máis informazón se obtén dun contrasinal que non sexa seguro<br>.<br><br>O * corresponde a calquer contrasinal, <i>Exemplo:</i> site chpass arq *<br>Isto permite que \"arq\" se autentique con calquer contrasinal<br><br>@ Corresponde a calquer contrasinal semellante a un enderezo de correo, <i>Exemplo:</i> site chpass arq @<br>Isto permitirá a \"arq\" conectar-se como \"a@b.com\" pero non como \"ab. com\"<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Comutar o estado de \"gadmin\" do usuário para o grupo indicado"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Comutar o estado de \"gadmin\" do usuário para o grupo indicado<br><b>NOTA:</b> cando un usuário se converte nun \"gadmin\", engadirá-se-lle automaticamente a opzón2.<br>Cando un usuário se deixa de ser \"gadmin\" de <br>calquer dos seus grupos a opzón \"gadmin\" será automaticamente<br>retirada.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Mostrar as opzóns dun usuário"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Mostra as opzóns dun usuário<br><br><i>Exemplo:</i> site flags<br><br>Isto mostrará as suas próprias opzóns.<br><br><i>Exemplo:</i> site flags Arquimedes<br><br>Isto mostrará as opzóns do usuário Arquimedes.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Expulsar un usuário do sítio"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Expulsar un usuário do sítio<br><br><i>Exemplo:</i> site kick Arquimedes<br><br>Isto matará todas as conexóns do usuário \"Arquimedes\"<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Elimina os usuários borrados, \"site READD\" non funcionará para os usuários purgados."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Eliminar os usuários borrados, \"site READD\" non funcionará para os usuários purgados.<br><br><i>Exemplo:</i> site purge<br>Isto vai REMOVER TODOS os usuários coa opzón DELETED sinalada. <br><br><i>Exemplo:</i> site purge manolo<br>Isto borrará só a \"manolo\" e deixará os restantes usuários borrados do sítio<br><br>Se é un \"gadmin\", só poderá borrar os usuários do seu grupo (isto é, <br>se ten aceso a este comando no ficheiro de configurazón).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Engadir de novo o usuário"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Engadir de novo o usuário<br><br><i>Exemplo:</i> site readd<br><br>Isto mostrará unha lista dos usuários que poden ser engadidos de novo. <br>(Tamén pode conseguir isto con \" site users deleted\")<br><br><i>Exemplo:</i> site readd Arquimedes<br><br>Isto retirará a opzón DELETED do usuário \"Arquimedes\".<br><br><b>NOTA:</b> Ao volver a engadir un usuário dun grupo, este debe ter espazos libres disponíbeis,<br>mesmo cando sexa é un \"siteop\" (operador do sítio) .<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Mostrar as estatísticas de envio/recepzón dun usuário"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Mostrar as estatísticas de envio/recepzón dun usuário<br><br>Definido en \"/ftp-data/text/user.stats\"<br><br>Se tivese varias seczóns, entón isto mostrará as estatísticas de<br>todas as seczóns. (Pero terá que copiar este ficheiro para SECZONuser.stats.<br>Exemplo: se ten unha seczón chamada XOGOS, entón \"glftpd\" procurará<br>os ficheiros \"user.stats\" e \"XOGOSuser.stats\" no cartafol /ftp-data/text.<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Listar os usuários / Mostrar informazón detallada sobre un usuário"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Listar os usuários / Mostrar informazón detallada sobre un usuário<br><br><i>Exemplo:</i> site user<br><br>Isto mostrará unha lista con todos os usuários conectados ao sítio.<br><br><i>Exemplo:</i> site user Arquimedes<br><br>Isto mostrará informazón detallada sobre o usuário \"Arquimedes\".<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Mostra os grupos disponíbeis"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Mostra informazón detallada sobre un grupo"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Mostrar informazón detallada sobre un grupo<br><br><i>Exemplo:</i> site ginfo ftp<br><br>Isto mostrará informazón detallada sobre o grupo \"ftp\".<br>Se un usuário fose borrado, a sua marca será substituída por \"***BORRADO***\".<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Engadir un grupo novo"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Engadir un grupo novo<br><br><i>Exemplo:</i> site grpadd grupo grupo_novo<br><br>Isto engadirá o grupo \"grupo\" coa descrizón \"grupo_novo\".<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Borrar un grupo"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Borrar un grupo<br><br><i>Exemplo:</i> site grpdel grupo<br><br>Isto borrará o grupo \"grupo\".<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Mostrar os grupos actuais ou unir-se/sair dun grupo"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Mostrar os grupos actuais ou unir-se/sair dun grupo<br>Para unir-se a un grupo, abonda pasar o nome do grupo como un parámetro do comando.<br>. Deberá desconectar-se de todos os grupos antes de poder-se xuntar a un novo.<br>Só os usuários coa opzón \"siteop\" activada poderán modificar os grupos<br>privados (consulte \"site CHGRP\").<br><br><i>Exemplo:</i> site group<br><br>Mostrará os grupos en que está.<br><br><i>Exemplo:</i> site group ftp<br><br>Con isto, unirá-se ao grupo \"ftp\".<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Cambiar a descrizón dun grupo"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Cambiar a descrizón dun grupo<br><br><i>Exemplo:</i> site grpnfo ftp nova_descrizon<br><br>Isto cambiará a descrizón actual do grupo \"ftp\" para <br>\"nova_descrizón\".<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Mostrar a liña do seu estado actual"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Mostrar os maiores transferidores"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Mostrar os maiores transferidores"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Mostrar os maiores transferidores que pertencen ao grupo"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores transferidores.<br>O <grupo> tamén é opcional. Se indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Mostrar os maiores subidores"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Mostrar os maiores subidores que pertencen ao grupo"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores subidores.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Mostrar os maiores subidores de hoxe"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Mostrar os maiores subidores de hoxe que pertencen ao grupo"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores subidores do dia.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Mostrar os maiores transferidores do dia"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Mostrar os maiores transferidores do dia que pertencen ao grupo"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores transferidores do dia.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Mostrar os maiores subidores do mes"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Mostrar os maiores subidores do mes que pertencen ao grupo"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores subidores do mes.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Mostrar os maiores transferidores do mes"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Mostrar os maiores transferidores do mes que pertencen ao grupo"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores transferidores do mes.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Mostrar o maior \"nuketop\""
+
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Mostrar o maior \"nuketop\""
+
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Mostrar os maiores \"nuketop\" que pertencen ao grupo"
+
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar o maior \"nuketop\".<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Mostrar os maiores subidores da semana"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Mostrar os maiores subidores da semana que pertencen ao grupo"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores subidores da semana.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Mostrar os maiores transferidores da semana"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Mostrar os maiores transferidores da semana que pertencen ao grupo"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Mostrar os maiores transferidores da semana.<br>O <grupo> tamén é opcional. Se o indica, mostrará só os usuários que<br>pertencen a ese grupo, pero o usuário que o faga deberá ter aceso<br>especial a glftpd.conf para facé-lo. Isto é controlado pola opzón -grpstats<br>."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Mostrar o tránsito do servidor"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Mostrar o tránsito do servidor<br>Mostra as recepcions/envios totais de todos os usuários en todas as seczóns"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Mostrar os maiores envios do grupo"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Mostrar os maiores envios do grupo<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Mostrar os envios do grupo no mes"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Mostrar os envios do grupo no mes<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Mostrar as recepzóns do grupo no mes"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Mostrar as recepzóns do grupo no mes<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Mostrar os maiores envios do grupo na semana"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Mostrar os maiores envios do grupo na semana<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Mostrar as maiores recepzóns do grupo na semana"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Mostrar as maiores recepzóns do grupo na semana<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Mostrar as maiores recepzóns do grupo"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Mostrar as maiores recepzóns do grupo<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Carregar o ficheiro do usuário na memória do seu proceso; esencialmente, converte-se nese usuário."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Carregar o ficheiro do usuário na memória do seu proceso; esencialmente, converte-se<br>nese usuário (ainda que algunhas cousas, como o cartafol persoal ou o resultado de \"site who\"'<br>, non se alteren). Necesita do permiso \"-emulate\" no ficheiro de configurazón.<br>Isto foi criado para alguns programas especiais, para que podan actuar cun usuário dado<br>sen ter que saber o seu contrasinal e autenticar-se como ese usuário.<br>A maioria dos \"siteops\" non verán nengunha utilidade para isto.<br><br>Nota: Isto non é unha emulazón VERDADEIRA, polo que non debe usar isto para facer algo sério.<br> Algunhas cousas non funcionarán; outras funcionarán de forma incorrecta.<br>A única forma de obter unha emulazón \"verdadeira\" é autenticar-se como ese usuário.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Mostrar a pantalla de axuda"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Mostrar a pantalla de axuda<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Mostrar as autenticazóns erradas"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Mostrar as autenticazóns erradas<br><br>Isto mostra \"/glftpd/ftp-data/logs/login.log\"<br>Consulte a informazón sobre \"site syslog\" para saber a sintaxe.<br>"
+
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Mostrar as versións atacadas recentemente"
+
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Mostrar as versións nuked recentemente<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Verificar a última data de conexón dun usuário"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Verificar a última data de conexón dun usuário<br><br><i>Exemplo:</i> site seen Arquimedes<br><br>Isto mostrará a última vez que Arquimedes se conectou.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Mostrar en bruto o ficheiro do usuário"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Mostrar en bruto o ficheiro do usuário<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Mostrar informazón detallada sobre os usuários conectados"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Mostrar informazón detallada sobre os usuários conectados<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "Enviar o&s Favoritos Para"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Non hai contactos disponíbeis>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Desactivado nesta versión de KDE>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Está a piques de enviar os seus favoritos de KFTPGrabber para <b>%1</b>. Poden conter contrasinais ou certificados X509 importantes: o envio dos seus favoritos pode comprometer a sua seguridade.<br><br>Está seguro?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Enviar os Favoritos"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Este servidor é un servidor distribuído de FTP"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Está seguro de que desexa borrar estes ficheiros?"
+
+#~ msgid "Date"
+#~ msgstr "Data"
+
+#~ msgid "Permissions"
+#~ msgstr "Permisos"
+
+#~ msgid "Owner"
+#~ msgstr "Dono"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Non foi posíbel abrir o cartafol \"%1\"."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Este cartafol contén 1 ficheiro.\n"
+#~ "Este cartafol contén %n ficheiros."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Mostrar todo pode levar algun tempo."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Está seguro?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "A transferir..."
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Xeral"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Engadir un Novo Padrón"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Está seguro de que desexa borrar este padrón?"
+
+#~ msgid "&Other"
+#~ msgstr "&Outros"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Mudar os nomes dos ficheiros para minúsc&ulas ao transferir"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Rea&lce"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "&Engadir un Padrón..."
+
+#~ msgid "E&dit..."
+#~ msgstr "E&ditar..."
+
+#~ msgid "Re&move"
+#~ msgstr "&Borrar"
+
+#~ msgid "E&nabled"
+#~ msgstr "A&ctivo"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Lista de prior&idades"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Padrón de prioridade:"
+
+#~ msgid "Patterns"
+#~ msgstr "Padróns"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "&Engadir un Padrón"
+
+#~ msgid "&Low"
+#~ msgstr "&Baixa"
+
+#~ msgid "Value:"
+#~ msgstr "Valor:"
+
+#~ msgid "&Skip"
+#~ msgstr "&Ignorar"
+
+#~ msgid "&High"
+#~ msgstr "A&lta"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Configurazón da Lista de Prioridades"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "A&ctivar a lista de prioridades"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "Ign&orar os ficheiros valeiros"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Aplicar a lis&ta de prioridades aos cartafoles"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Non pór na &cola os ficheiros que estexan lista de ficheiros a ignorar"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Colocar os cartafoles antes dos ficheiros na fila"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "Unha lista de padróns de ficheiros a realzar ao navegar."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Se os ficheiros da lista de filtros deben ser realzados."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Se os ficheiros na lista de ficheiros a ignorar serán ignorados."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Se os ficheiros valeiros deben ser ignorados."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Se a lista de itens a ignorar se aplica tamén aos cartafoles."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Non colocar na cola de espera os ficheiros que estexan lista de itens a ignorar."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Colocar os cartafoles antes dos ficheiros na cola."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Se os nomes dos ficheiros obtidos deben ser pasados para minúsculas."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "editshred"
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/kftpgrabber.po b/translations/hu/messages/kftpgrabber.po
new file mode 100644
index 0000000..494d2c6
--- /dev/null
+++ b/translations/hu/messages/kftpgrabber.po
@@ -0,0 +1,3432 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2004-11-02 17:35+0100\n"
+"Last-Translator: Kroly Barcza (VectoR) <kbarcza@blackpanther.hu>\n"
+"Language-Team: V.group Translator Team <translator@vgroup.hu>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "Kapcsolódás..."
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+#, fuzzy
+msgid "matches regexp"
+msgstr "FreeBSD javítások"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Könyvtár"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Letöltés"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Feltöltés"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+#, fuzzy
+msgid "Filename"
+msgstr "Fájlnév:"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Méret"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "Webhely &választás"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Cél"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+#, fuzzy
+msgid "KFTPGrabber import"
+msgstr "KFTP Grabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+#, fuzzy
+msgid "File Exists"
+msgstr "A fájl létezik"
+
+#: src/main.cpp:50
+#, fuzzy
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTP Grabber egy grafikus FTP kliens a KDE-hez."
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+#, fuzzy
+msgid "KFTPGrabber"
+msgstr "KFTP Grabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Elsődleges fejlesztő"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Fejlesztő"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr ""
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc code"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon popup code"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+#, fuzzy
+msgid "Icon design"
+msgstr "Ikon dizájn"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr ""
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "A könyvtár neve"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "A kapcsolat létrejött ezzel: %1"
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "A fájl átvitel"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Engedélyek"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Nem sikerült megnyitni írásra a fájlt!"
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+#, fuzzy
+msgid "Logging in..."
+msgstr "A dekódolás nem sikerült."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "A dekódolás nem sikerült."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+#, fuzzy
+msgid "Unable to initialize SFTP channel."
+msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#: src/engine/sftpsocket.cpp:187
+#, fuzzy
+msgid "Unable to initialize SFTP."
+msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "Le&választás"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Kapcsolódás..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Kapcsolódás..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Félbeszakítás"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+#, fuzzy
+msgid "Fetching directory listing..."
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Átvitel beállításai"
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Távoli könyvtár:"
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Átne&vezés"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "A kapcsolat létrejött ezzel: %1"
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Kapcsolódás..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "A kapcsolat létrejött ezzel: %1"
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "Átviteli mód:"
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Az üres könyvtára&k eltávolítása"
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Átvitel beállításai"
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "Le&választás"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "A kapcsolat létrejött ezzel: %1"
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+#, fuzzy
+msgid "Idle."
+msgstr "inaktív"
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/engine/connectionretry.cpp:66
+#, fuzzy
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Kapcsolódás..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Átne&vezés"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Kapcsolódás..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Kapcsolódás..."
+
+#: src/engine/connectionretry.cpp:93
+#, fuzzy
+msgid "Retry aborted."
+msgstr "&Félbeszakítás"
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+#, fuzzy
+msgid "Same"
+msgstr "Név"
+
+#: src/kftpfileexistsactions.cpp:83
+#, fuzzy
+msgid "Older"
+msgstr "Egyéb"
+
+#: src/kftpfileexistsactions.cpp:86
+#, fuzzy
+msgid "Newer"
+msgstr "Új minta"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:103
+#, fuzzy
+msgid "Skip"
+msgstr "Lista átlépése"
+
+#: src/kftpfileexistsactions.cpp:104
+#, fuzzy
+msgid "Overwrite"
+msgstr "A könyvjelzők &felülírása"
+
+#: src/kftpfileexistsactions.cpp:105
+#, fuzzy
+msgid "Resume"
+msgstr "Átne&vezés"
+
+#: src/kftpfileexistsactions.cpp:106
+#, fuzzy
+msgid "Rename"
+msgstr "Átne&vezés"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr ""
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Napló (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+#, fuzzy
+msgid "Local Session"
+msgstr "Lokális munkafolyamat"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Napló"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "A kapcsolat létrejött ezzel: %1"
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Munkafolyamat"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+#, fuzzy
+msgid "Close Session"
+msgstr "Munkafolyamat lezárása"
+
+#: src/mainactions.cpp:77
+#, fuzzy
+msgid "Quick &Connect..."
+msgstr "&Gyors csatlakozás:"
+
+#: src/mainactions.cpp:78
+#, fuzzy
+msgid "&New Session"
+msgstr "Új &folyamat"
+
+#: src/mainactions.cpp:80
+#, fuzzy
+msgid "&Left Side"
+msgstr "&Bal oldalt"
+
+#: src/mainactions.cpp:81
+#, fuzzy
+msgid "&Right Side"
+msgstr "&Jobb oldalt"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+#, fuzzy
+msgid "&Transfer Mode (Auto)"
+msgstr "Automatikus átvitelimód"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Bináris"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Automatikus"
+
+#: src/mainactions.cpp:129
+#, fuzzy
+msgid "&Transfer Mode (ASCII)"
+msgstr "Fájlok &átvitele ASCII-módban"
+
+#: src/mainactions.cpp:136
+#, fuzzy
+msgid "&Transfer Mode (Binary)"
+msgstr "Fájlok &átvitele Binary-módban"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+#, fuzzy
+msgid "Select..."
+msgstr "Kiválaszt"
+
+#: src/widgets/kftpserverlineedit.cpp:95
+#, fuzzy
+msgid "No name"
+msgstr "Név"
+
+#: src/widgets/failedtransfers.cpp:59
+#, fuzzy
+msgid "Transfer"
+msgstr "Át&vitel"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, fuzzy, no-c-format
+msgid "Description"
+msgstr "Leírás:"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+#, fuzzy
+msgid "&Restart Transfer"
+msgstr "Átvitelek &indítása"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+#, fuzzy
+msgid "R&emove"
+msgstr "Mindet eltávolítja"
+
+#: src/widgets/failedtransfers.cpp:121
+#, fuzzy
+msgid "Remove All"
+msgstr "Mindet eltávolítja"
+
+#: src/widgets/failedtransfers.cpp:180
+#, fuzzy
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Biztosan el szeretné távolítani ezt a szervert ?"
+
+#: src/widgets/failedtransfers.cpp:188
+#, fuzzy
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "El szeretné távolítani az összes fájlt?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Űrlap1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, fuzzy, no-c-format
+msgid "New Pattern"
+msgstr "Új minta"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Fájlnévminta:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Szín:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, fuzzy, no-c-format
+msgid "Quick Connect"
+msgstr "Gyors csatlakozás"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+#, fuzzy
+msgid "a hostname"
+msgstr "FTP nevének megadása"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:292
+#, fuzzy
+msgid "your username"
+msgstr "Felhasználónév:"
+
+#: src/widgets/quickconnect.cpp:295
+#, fuzzy
+msgid "your password"
+msgstr "Jelszó:"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr ""
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+#, fuzzy
+msgid "Sites Near You"
+msgstr "Bizalmas FTP címek"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+#, fuzzy
+msgid "No sites published."
+msgstr "<Nincs publikált szolgáltatás>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Minta"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Szín"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Új sablon hozzáadása"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Bekapcsolva"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Kiemelés"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Ez még nem használható.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+#, fuzzy
+msgid "Skip List"
+msgstr "Lista átlépése"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+#, fuzzy
+msgid "ASCII xtensions"
+msgstr "ASCII kiterjesztések"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Általános"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Átvitelek"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Megjelenítés"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+#, fuzzy
+msgid "Actions"
+msgstr "Hely:"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+#, fuzzy
+msgid "Filters"
+msgstr "Szűrő"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr ""
+
+#: src/widgets/verifier.cpp:137
+#, fuzzy
+msgid "Verification complete!"
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Fájlnév:"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Szűrő"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Letöltés"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Átne&vezés"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Új minta"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Kategória átnevezése"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Kapcsolódás"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr ""
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr " Várakozás "
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "fut"
+
+#: src/widgets/queueview/queueview.cpp:303
+#, fuzzy
+msgid "Waiting for connection..."
+msgstr "Kapcsolódás..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+#, fuzzy
+msgid "Filter: "
+msgstr "Szűrő"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Név"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Forrás"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Cél"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Folyamat"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Sebesség"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Letöltés"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "&Megsemmisítés"
+
+#: src/widgets/queueview/queueview.cpp:557
+#, fuzzy
+msgid "&Start Transfer"
+msgstr "Átvitelek &indítása"
+
+#: src/widgets/queueview/queueview.cpp:558
+#, fuzzy
+msgid "&Abort Transfer"
+msgstr "Átvitel megszakítása."
+
+#: src/widgets/queueview/queueview.cpp:560
+#, fuzzy
+msgid "Remove &All"
+msgstr "Mindet eltávolítja"
+
+#: src/widgets/queueview/queueview.cpp:561
+#, fuzzy
+msgid "Move &Up"
+msgstr "Mozgatás &lefelé"
+
+#: src/widgets/queueview/queueview.cpp:562
+#, fuzzy
+msgid "Move &Down"
+msgstr "Mozgatás &lefelé"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Mozgatás &lefelé"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+#, fuzzy
+msgid "&Change Transfer Info"
+msgstr "Átviteli információ váltása"
+
+#: src/widgets/queueview/queueview.cpp:568
+#, fuzzy
+msgid "&Load Queue From File"
+msgstr "Várakozási &sor betöltése fájlból"
+
+#: src/widgets/queueview/queueview.cpp:569
+#, fuzzy
+msgid "&Save Queue to File"
+msgstr "&Várakozási sor mentése fájlba"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Indítás"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "Szüne&t"
+
+#: src/widgets/queueview/queueview.cpp:573
+#, fuzzy
+msgid "&Add Transfer..."
+msgstr "Átvitel &hozzáadása"
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+#, fuzzy
+msgid "Show &Filter"
+msgstr "Szűrő"
+
+#: src/widgets/queueview/queueview.cpp:704
+#, fuzzy
+msgid "Site"
+msgstr "Méret"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Biztosan el szeretné távolítani ezeket az elemeket?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "El szeretné távolítani az összes fájlt?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+#, fuzzy
+msgid "Load Queue"
+msgstr "Várakozási lista betöltése"
+
+#: src/widgets/queueview/threadview.cpp:90
+#, fuzzy
+msgid "Site session [%1]"
+msgstr "Új &folyamat"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr ""
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "inaktív"
+
+#: src/widgets/queueview/threadview.cpp:95
+#, fuzzy
+msgid "disconnected"
+msgstr "Le&választás"
+
+#: src/widgets/queueview/threadview.cpp:111
+#, fuzzy
+msgid "connecting"
+msgstr "Kapcsolódás..."
+
+#: src/widgets/queueview/threadview.cpp:113
+#, fuzzy
+msgid "transferring"
+msgstr "Átvitel beállításai"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Állapot"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Nincsenek könyvjelzők."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "Átne&vezés"
+
+#: src/widgets/bookmarks/listview.cpp:115
+#, fuzzy
+msgid "&Create Subcategory..."
+msgstr "Új alkönyvtár létrehozása..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Méret"
+
+#: src/widgets/bookmarks/listview.cpp:367
+#, fuzzy
+msgid "Category Name"
+msgstr "Kategória neve"
+
+#: src/widgets/bookmarks/listview.cpp:367
+#, fuzzy
+msgid "Rename category:"
+msgstr "Kategória átnevezése"
+
+#: src/widgets/bookmarks/listview.cpp:383
+#, fuzzy
+msgid "New Category Name"
+msgstr "Új c neve"
+
+#: src/widgets/bookmarks/listview.cpp:383
+#, fuzzy
+msgid "New category:"
+msgstr "Új kategória"
+
+#: src/widgets/bookmarks/listview.cpp:403
+#, fuzzy
+msgid "New server"
+msgstr "Új minta"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Biztosan el szeretné távolítani ezt a kategóriát ?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Biztosan el szeretné távolítani ezt a szervert ?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+#, fuzzy
+msgid "Bookmark importing is complete."
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr ""
+
+#: src/widgets/bookmarks/editortls.cpp:65
+#, fuzzy
+msgid "SSL/TLS Settings"
+msgstr "TLS/SSL beállítások"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+#, fuzzy
+msgid "Export Bookmarks"
+msgstr "Könyvjelzők szerkesztése"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Félbeszakítás"
+
+#: src/widgets/browser/actions.cpp:105
+#, fuzzy
+msgid "&Show Tree View"
+msgstr "Fastruktúra megjelenítése"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Tulajdonságok"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Megsemmisítés"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Szűrő"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Át&vitel"
+
+#: src/widgets/browser/actions.cpp:126
+#, fuzzy
+msgid "&Queue Transfer"
+msgstr "Fájlátvitel &várakozási sor"
+
+#: src/widgets/browser/actions.cpp:127
+#, fuzzy
+msgid "&Create Directory..."
+msgstr "Könyvtár létrehozása"
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+#, fuzzy
+msgid "&More Actions"
+msgstr "Hely:"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+#, fuzzy
+msgid "&Export Directory Listing..."
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/widgets/browser/actions.cpp:136
+#, fuzzy
+msgid "Show &Hidden Files && Directories"
+msgstr "Rejtett fájlok és mappák megjelenítése"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "könyvtár létrehozása"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+#, fuzzy
+msgid "&Change Site"
+msgstr "Webhely &választás"
+
+#: src/widgets/browser/actions.cpp:162
+#, fuzzy
+msgid "&Quick Connect..."
+msgstr "&Gyors csatlakozás:"
+
+#: src/widgets/browser/actions.cpp:163
+#, fuzzy
+msgid "&Connect To"
+msgstr "Kapcsolódás"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "Le&választás"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+#, fuzzy
+msgid "Do you want to drop current connection?"
+msgstr "El akarod dobni az érvényes kapcsolatot?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Biztosan MEGSEMMISÍTI ezt a fájlt?"
+
+#: src/widgets/browser/actions.cpp:326
+#, fuzzy
+msgid "Shred File"
+msgstr "A fájl megsemmisítése"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Fájl törlése"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Lista átlépése"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Port:"
+
+#: src/widgets/browser/actions.cpp:543
+#, fuzzy
+msgid "Create Directory"
+msgstr "könyvtár létrehozása"
+
+#: src/widgets/browser/actions.cpp:543
+#, fuzzy
+msgid "Directory name:"
+msgstr "A könyvtár neve"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:648
+#, fuzzy
+msgid "Export Directory Listing"
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "Általán&os"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Távoli könyvtár"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "ismeretlen"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Típus:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Hely:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Méret:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "A létrehozás dátuma:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "Jo&gosultságok"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Elérési jogok"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Osztály"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"A bejegyzések\n"
+"megjelenítése"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Beolvasás"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"A bejegyzések\n"
+"írása"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Írás"
+
+#: src/widgets/browser/propsplugin.cpp:263
+#, fuzzy
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Belépés a szülőkönyvtárba"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Futtatás"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Speciális"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Felhasználó"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Csoport"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Egyebek"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "A UID beállítása"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "A GID beállítása"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Rögzítés"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "&Gyökérkönyvtár:"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Útvonal:"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Szűrő"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "könyvtár létrehozása"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "A fájl létezik"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "Webhely &választás"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+#, fuzzy
+msgid "Unable to open file for writing."
+msgstr "Nem sikerült megnyitni írásra a fájlt!"
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr ""
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+#, fuzzy
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr "Biztosan MEGSEMMISÍTI ezt a fájlt?"
+
+#: src/mainwindow.cpp:300
+#, fuzzy
+msgid "FTP Sites Near Me"
+msgstr "Bizalmas FTP címek"
+
+#: src/mainwindow.cpp:304
+#, fuzzy
+msgid "Sites In KWallet"
+msgstr "Bizalmas FTP címek"
+
+#: src/mainwindow.cpp:306
+#, fuzzy
+msgid "Edit Bookmarks..."
+msgstr "Könyvjelzők szerkesztése"
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+#, fuzzy
+msgid "Download: %1/s"
+msgstr "Letöltés"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+#, fuzzy
+msgid "Upload: %1/s"
+msgstr "Feltöltés"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, fuzzy, no-c-format
+msgid "Failed Transfers"
+msgstr "Átvitelek"
+
+#: src/mainwindow.cpp:358
+#, fuzzy
+msgid "Sites Near Me"
+msgstr "Bizalmas FTP címek"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, fuzzy, no-c-format
+msgid "Threads"
+msgstr "&Megsemmisítés"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Másolás"
+
+#: src/kftpbookmarks.cpp:307
+#, fuzzy
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Ez a könyvjelző fájl totkosított. Adja meg a titkosító kulcsot a feloldáshoz!"
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+#, fuzzy
+msgid "Decryption Failed"
+msgstr "A dekódolás nem sikerült."
+
+#: src/kftpbookmarks.cpp:328
+#, fuzzy
+msgid "&Overwrite Bookmarks"
+msgstr "A könyvjelzők &felülírása"
+
+#: src/kftpbookmarks.cpp:386
+#, fuzzy
+msgid "Enter key for bookmark file encryption."
+msgstr "Kérem adja meg a bookmarkhoz titkosító kulcsot!"
+
+#: src/kftpbookmarks.cpp:825
+#, fuzzy
+msgid "<No Services Published>"
+msgstr "<Nincs publikált szolgáltatás>"
+
+#: src/kftpbookmarks.cpp:830
+#, fuzzy
+msgid "<DNSSD Not Available>"
+msgstr "(Az állapot nem érhető el)"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Károly Barcza | www.blackpanther.hu"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "translator@vgroup.hu, kbarcza@blackpanther.hu"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Displa&y"
+msgstr "Megjelenítés"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "File &Browser"
+msgstr "Átvitelek"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Rejtett fájlok és mappák megjelenítése"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "Show &directory tree"
+msgstr "&Gyökérkönyvtár:"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "&Gyökérkönyvtár:"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Szűrő"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, fuzzy, no-c-format
+msgid "Destination:"
+msgstr "Cél"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, fuzzy, no-c-format
+msgid "Source:"
+msgstr "Forrás"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, fuzzy, no-c-format
+msgid "Server Info"
+msgstr "Szerver információ"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "A kiszolgáló neve:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Gép:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Jelszó:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Felhasználónév:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, fuzzy, no-c-format
+msgid "Font && Colors"
+msgstr "Napló kimeneti fontjai és színei"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, fuzzy, no-c-format
+msgid "Font:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Kliens parancsok színe."
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "A kiszolgáló válasz színe:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, fuzzy, no-c-format
+msgid "Error message color:"
+msgstr "A hiba színe:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Állapot üzenet szín"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, fuzzy, no-c-format
+msgid "&Output"
+msgstr "Kimeneti fájl"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, fuzzy, no-c-format
+msgid "&File Output"
+msgstr "Kimeneti fájl"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, fuzzy, no-c-format
+msgid "&Save log to file"
+msgstr "Napló mentése fájlba"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, fuzzy, no-c-format
+msgid "Source Server Info"
+msgstr "Forrás szerver információ"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, fuzzy, no-c-format
+msgid "Destination Server Info"
+msgstr "Cél szerver információ"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Forrás:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Cél:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Átvitel típusa:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, fuzzy, no-c-format
+msgid "Co&nnection"
+msgstr "Kapcsolódás"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, fuzzy, no-c-format
+msgid "Active Connection IP"
+msgstr "Az aktív kapcsolat beállítások"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, fuzzy, no-c-format
+msgid "IP/hostname:"
+msgstr "Gép:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, fuzzy, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Az aktív kapcsolat beállítások"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, fuzzy, no-c-format
+msgid "Speed limit"
+msgstr "Sebesség"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Download (KB/s):"
+msgstr "Letöltés"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Feltöltés"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Dis&k Space"
+msgstr "Szabad lemezterület ellenőrzése"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Szabad lemezterület ellenőrzése"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Interval (sec):"
+msgstr "Lemezterület ellenőrzés intervallum (sec):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimális szabad terület (mb):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Thre&ads"
+msgstr "&Megsemmisítés"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Number of threads per session:"
+msgstr "Úrapróbálkozás száma (0 = végtelen):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Egyéb"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Az üres könyvtára&k eltávolítása"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "ftpSiteProperties"
+msgstr "&Tulajdonságok"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, fuzzy, no-c-format
+msgid "Hostname:"
+msgstr "Gép:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, fuzzy, no-c-format
+msgid "FTP"
+msgstr "FXP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Távoli könyvtár:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Helyi könyvtár:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, fuzzy, no-c-format
+msgid "&Anonymous login"
+msgstr "Anonymous bejelentkezés"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, fuzzy, no-c-format
+msgid "&Advanced"
+msgstr "Speciális"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, fuzzy, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "A passzív üzemmód (PASV) enge&délyezése"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, fuzzy, no-c-format
+msgid "Disable use of passive mode"
+msgstr "A passzív üzemmód (PASV) enge&délyezése"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, fuzzy, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, fuzzy, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "A fájl átvitel"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, fuzzy, no-c-format
+msgid "Server Encoding"
+msgstr "Szerver információ"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, fuzzy, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Újracsatlakozás hiba esetén"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Újra"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Úrapróbálkozás száma (0 = végtelen):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Újra végrehajtási késleltetés:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, fuzzy, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "A &szűrők szerkesztése..."
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, fuzzy, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII kiterjesztések"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, fuzzy, no-c-format
+msgid "Add Extension"
+msgstr "Új kiterjesztés hozzáadása"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Kiterjesztés:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Kiterjesztés"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Kapcsolódás..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Kapcsolódás..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "FTP nevének megadása"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, fuzzy, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anonymous bejelentkezés"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Névtelen bejelentkezési ellenőrzése"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Adja meg a fiók felhasználónevét"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Adja meg a fiók jelszót"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, fuzzy, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Hozzáadás a könyvjelzőkhöz"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Speciális"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "A kapcsolat létrejött ezzel: %1"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, fuzzy, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 tanúsítvány"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Elérési út:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, fuzzy, no-c-format
+msgid "E-mail &Address"
+msgstr "Cím:"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, fuzzy, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "A program indítása minimalizálva a tálcán"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, fuzzy, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Az üres könyvtára&k eltávolítása"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, fuzzy, no-c-format
+msgid "Site Defaults"
+msgstr "A fájl átvitel"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, fuzzy, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Könyvjelzőfájl titkosítása"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, fuzzy, no-c-format
+msgid "&Notification"
+msgstr "Értesítési opciók:"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, fuzzy, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Forrás:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, fuzzy, no-c-format
+msgid "File list"
+msgstr "A fájl létezik"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, fuzzy, no-c-format
+msgid "Failed"
+msgstr "Szűrő"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, fuzzy, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Könyvjelzőfájl titkosítása"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, fuzzy, no-c-format
+msgid "Default local directory."
+msgstr "Alapértelmezett helyi könyvtár:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, fuzzy, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Az üres könyvtára&k eltávolítása"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, fuzzy, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Az üres könyvtára&k eltávolítása"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, fuzzy, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, fuzzy, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Úrapróbálkozás száma (0 = végtelen):"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "&Gyökérkönyvtár:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Szűrő"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr ""
+
+#, fuzzy
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Nincs felhasználónév ehhez: '%1'!"
+
+#, fuzzy
+#~ msgid "Error Connecting"
+#~ msgstr "Hiba történt csatlakozáskor."
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Beállítások"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Gyors csatlakozás"
+
+#, fuzzy
+#~ msgid "Webpage design"
+#~ msgstr "Ikon dizájn"
+
+#, fuzzy
+#~ msgid "Server Management"
+#~ msgstr "A kiszolgáló neve:"
+
+#, fuzzy
+#~ msgid "Site Command Dialog"
+#~ msgstr "Kliens parancsok színe."
+
+#, fuzzy
+#~ msgid "Username"
+#~ msgstr "Felhasználónév:"
+
+#, fuzzy
+#~ msgid "Group name"
+#~ msgstr "Csoport"
+
+#, fuzzy
+#~ msgid "Description name"
+#~ msgstr "Leírás:"
+
+#, fuzzy
+#~ msgid "Password retype:"
+#~ msgstr "Jelszó:"
+
+#, fuzzy
+#~ msgid "This will change your password"
+#~ msgstr "Jelszó:"
+
+#, fuzzy
+#~ msgid "Change user's password"
+#~ msgstr "Jelszó:"
+
+#, fuzzy
+#~ msgid "Add a new group"
+#~ msgstr "Új sablon hozzáadása"
+
+#, fuzzy
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "A könyvjelzők &küldése"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Kapcsolat nem elérhető>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Disabled in this version of KDE>"
+
+#, fuzzy
+#~ msgid "Send Bookmarks"
+#~ msgstr "A könyvjelzők küldése"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Biztosan törölni szeretné ezt a fájlt(kat)?"
+
+#~ msgid "Date"
+#~ msgstr "Dátum"
+
+#~ msgid "Permissions"
+#~ msgstr "Engedélyek"
+
+#, fuzzy
+#~ msgid "Owner"
+#~ msgstr "Egyéb"
+
+#, fuzzy
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "%1 könyvtárat nem sikerült megnyitni!"
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr "Ez a könyvtár tartalmaz %1 fájlt."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Biztosan ezt szeretné?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Átvitel beállításai"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Átvitel beállításai"
+
+#, fuzzy
+#~ msgid "Add New Pattern"
+#~ msgstr "Új sablon hozzáadása"
+
+#, fuzzy
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Biztosan el szeretné távolítani ezt a sablont ?"
+
+#, fuzzy
+#~ msgid "&Other"
+#~ msgstr "Egyéb"
+
+#, fuzzy
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Kiemelés"
+
+#, fuzzy
+#~ msgid "&Add Pattern..."
+#~ msgstr "Új sablon hozzáadása"
+
+#, fuzzy
+#~ msgid "Re&move"
+#~ msgstr "Mindet eltávolítja"
+
+#, fuzzy
+#~ msgid "E&nabled"
+#~ msgstr "Bekapcsolva"
+
+#, fuzzy
+#~ msgid "Priority pattern:"
+#~ msgstr "Minta átlépése"
+
+#~ msgid "Patterns"
+#~ msgstr "Minták"
+
+#, fuzzy
+#~ msgid "&Add Pattern"
+#~ msgstr "Új sablon hozzáadása"
+
+#, fuzzy
+#~ msgid "&Skip"
+#~ msgstr "Lista átlépése"
+
+#, fuzzy
+#~ msgid "Priority List Settings"
+#~ msgstr "A lista beállítások átlépése"
+
+#, fuzzy
+#~ msgid "E&nable priority list"
+#~ msgstr "A &dokumentumlista elrejtése <<"
+
+#, fuzzy
+#~ msgid "S&kip empty files"
+#~ msgstr "Az új fájlok üresnek tekintése"
+
+#, fuzzy
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Érvényes legyen az egész site-ra"
+
+#, fuzzy
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Érvényes legyen az egész site-ra"
+
+#, fuzzy
+#~ msgid "Queue directories before files."
+#~ msgstr "Az üres könyvtára&k eltávolítása"
+
+#, fuzzy
+#~ msgid "&Set Filter..."
+#~ msgstr "Szűrőbeállítások"
+
+#, fuzzy
+#~ msgid "Clear Filter"
+#~ msgstr "A szűrő törlése"
+
+#~ msgid "Filter"
+#~ msgstr "Szűrő"
+
+#, fuzzy
+#~ msgid "Enter filter:"
+#~ msgstr "Belépés a szülőkönyvtárba"
+
+#, fuzzy
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL beállítások"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Átviteli mód:"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - törlés (Nincs SSL-támogatás)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "A dekódolás nem sikerült."
+
+#~ msgid "Transfer:"
+#~ msgstr "Átvitel:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Le: %1/s Fel: %1/s"
+
+#, fuzzy
+#~ msgid "FXP transfer failed."
+#~ msgstr "A fájl átvitel"
+
+#, fuzzy
+#~ msgid "Directory listing complete."
+#~ msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#, fuzzy
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#, fuzzy
+#~ msgid "Unable to connect with server."
+#~ msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#, fuzzy
+#~ msgid "Directory is not in cache."
+#~ msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#, fuzzy
+#~ msgid "Unable to open directory."
+#~ msgstr "Könyvtárat nem sikerült megnyitni!"
+
+#, fuzzy
+#~ msgid "View &Local"
+#~ msgstr "Helyi megtekintés"
+
+#, fuzzy
+#~ msgid "&Offline Mode"
+#~ msgstr "Kapcsolat &nélküli mód"
+
+#, fuzzy
+#~ msgid "This URL is not in the cache."
+#~ msgstr "Az URL nem kezdőtartományban van!"
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "A könyvtár nincs a gyorsítótárban!"
+
+#, fuzzy
+#~ msgid "Boo&kmarks"
+#~ msgstr "A könyvjelzők küldése"
+
+#, fuzzy
+#~ msgid "Script & Event Editor"
+#~ msgstr "&Szkript szerkesztő"
+
+#, fuzzy
+#~ msgid "Event Name"
+#~ msgstr "Átne&vezés"
+
+#, fuzzy
+#~ msgid "Script Editor"
+#~ msgstr "&Szkript szerkesztő"
+
+#~ msgid "Unknown (FXP)"
+#~ msgstr "ismeretlen (FXP)"
+
+#, fuzzy
+#~ msgid "&Filter Editor..."
+#~ msgstr "A &szűrők szerkesztése..."
+
+#, fuzzy
+#~ msgid "&Script Editor..."
+#~ msgstr "&Szkript szerkesztő"
+
+#, fuzzy
+#~ msgid "&Threads"
+#~ msgstr "&Megsemmisítés"
+
+#~ msgid "Preferences"
+#~ msgstr "Egyéb beállítások"
+
+#, fuzzy
+#~ msgid "General Preferences"
+#~ msgstr "Általános beállítások"
+
+#~ msgid "Log font:"
+#~ msgstr "Napló betűkészlet:"
+
+#~ msgid "UNKNOWN_FONT"
+#~ msgstr "UNKNOWN_FONT"
+
+#, fuzzy
+#~ msgid "File View"
+#~ msgstr "Fájl megtekintése"
+
+#~ msgid "Show tree view"
+#~ msgstr "Fastruktúra megjelenítése"
+
+#~ msgid "IP address/hostname:"
+#~ msgstr "IP cím/hosztnév:"
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: Transferred %1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr "Átvitel típusa:"
+
+#, fuzzy
+#~ msgid "User name"
+#~ msgstr "Felhasználónév:"
+
+#~ msgid "Quick &connect"
+#~ msgstr "&Gyors csatlakozás:"
+
+#, fuzzy
+#~ msgid "Adds a user"
+#~ msgstr "Új sablon hozzáadása"
+
+#, fuzzy
+#~ msgid "Rename a group"
+#~ msgstr "Kategória átnevezése"
+
+#, fuzzy
+#~ msgid "Nuke a director"
+#~ msgstr "könyvtár létrehozása"
+
+#, fuzzy
+#~ msgid "Unnuke a directory"
+#~ msgstr "könyvtár létrehozása"
+
+#~ msgid "German translation"
+#~ msgstr "Német fordítás"
+
+#, fuzzy
+#~ msgid "Spanish translation"
+#~ msgstr "Német fordítás"
+
+#, fuzzy
+#~ msgid "Hungarian translation"
+#~ msgstr "Német fordítás"
+
+#, fuzzy
+#~ msgid "French translation"
+#~ msgstr "Német fordítás"
+
+#, fuzzy
+#~ msgid "User name (Optional):"
+#~ msgstr "Felhasználónév:"
+
+#, fuzzy
+#~ msgid "Description name (Optional):"
+#~ msgstr "Cél"
+
+#~ msgid "Download: %1/s Upload: %1/s"
+#~ msgstr "Letöltés: %1/s Feltöltés: %1/s"
+
+#~ msgid "Name already in use"
+#~ msgstr "A becenév foglalt"
+
+#~ msgid "This connection is NOT secure."
+#~ msgstr "Ez a kapcsolat NEM biztonságos."
+
+#~ msgid "&Save settings"
+#~ msgstr "A &beállítások mentése"
+
+#~ msgid "&Configure KFTP Grabber"
+#~ msgstr "&KFTP Grabber beállítása"
+
+#~ msgid "C&ustom"
+#~ msgstr "E&gyéni"
+
+#~ msgid "Look (read only) account"
+#~ msgstr "Betekintő (csak olvasható) fiók"
+
+#~ msgid "TLS/SSL"
+#~ msgstr "TLS/SSL"
+
+#~ msgid "Enable TLS support if available"
+#~ msgstr "A TLS enge&délyezése, ha a kiszolgáló támogatja"
+
+#~ msgid "Default remote directory:"
+#~ msgstr "Alapértelmezett távoli könyvtár"
+
+#~ msgid "Enter ftp's port"
+#~ msgstr "FTP port megadása"
+
+#, fuzzy
+#~ msgid "&Copy server"
+#~ msgstr "A kiszolgáló beállításai"
+
+#~ msgid "Please enter all required information!"
+#~ msgstr "Meg kell adni az összes szükséges információt."
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/kftpgrabber.po b/translations/it/messages/kftpgrabber.po
new file mode 100644
index 0000000..8972c62
--- /dev/null
+++ b/translations/it/messages/kftpgrabber.po
@@ -0,0 +1,2977 @@
+# translation of kftpgrabber.po to Italian
+#
+# Nicola Ruggero <nixprog.adsl@tiscali.it>, 2005, 2006.
+# Nicola Ruggero <nicola@nxnt.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-04-21 14:26+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "contiene"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "non contiene"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "è uguale"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "non è uguale"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "corrisponde a espressione regolare"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "non corrisponde a espressione regolare"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "è"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "non è"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Cartella"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "è più grande di"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "è più piccolo di"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "bytes"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Per favore inserisci un'azione."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Priorità:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Scarica"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Invia"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Tag sconosciuto durante l'analisi dei comandi personalizzati del sito!"
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>L'operazione richiesta non è riuscita! La risposta del server è:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Il gestore per l'analisi della risposta chiamato <b>%1</b> "
+"non è stato trovato!</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Nome file"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Tipo voce"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Dimensione"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Cambia priorità"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Salta quando metti in coda"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Colora in visuale lista"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Nascondi in visuale lista"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Destinazione minuscola"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Regola senza nome"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Importa gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Importa KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Importa NcFtp"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "Importazione FileZilla 3"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Tutti i trasferimenti in coda sono stati completati."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Il file esiste"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - un client FTP per KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "URL opzionale a cui connettersi"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Sviluppatore principale"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Sviluppatore"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Codice LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Codice otpCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Codice fumetti a comparsa di Kopete"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Grafico del traffico"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Disegno icone"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Prove e correzione errori"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Codice analisi cartelle"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Codice gestione colonna in visuale lista"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Il trasferimento dei seguenti file è stato completato:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Connessione al server non riuscita."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Accesso al server non riuscito"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Impossibile trovare il file di origine."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Permesso negato."
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr "Impossibile aprire il file locale in lettura o scrittura."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Trasferimento non riuscito."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Il trasferimento dei seguenti file <b>è stato annullato</b> "
+"perché non c'è più spazio disponibile in \"%1\":"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Impossibile stabilire una connessione SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Accesso in corso..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Connesso con il server, accesso in corso..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Accesso non riuscito."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Autenticazione interattiva (con la tastiera) riuscita."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Autenticazione con chiave publica riuscita."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Impossibile inizializzare il canale SFTP."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Impossibile inizializzare SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Connesso."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Connessione..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Connessione a %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Annullato."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Uso elenco cartelle in memoria."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Lettura elenco cartelle..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Trasferimento..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Scaricamento file \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Invio file \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Eliminazione..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Rinomina..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Cambiamento permessi..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Connessione non riuscita."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"Negoziazione SSL riuscita. La connessione è sicura con SSL %1 bit cifrario %2."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "Negoziazione SSL non riuscita. Accesso annullato."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "Richiesta di negoziazione SSL non riuscita. Accesso annullato."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "Negoziazione SSL non riuscita. Connessione annullata."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Connesso al server, attesa messaggio di benvenuto..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Impossibile connettersi (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Famiglia indirizzi incompatibile per PORT ma EPRT non è supportato, operazione "
+"annullata!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Connessione di dati con %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Impossibile stabilire un socket in ascolto."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "In attesa della connessione dati sulla porta %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Connessione di dati stabilita."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Canale di dati sicuro con SSL %1 bit."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"Negoziazione SSL per il canale di dati non riuscita. Trasferimento annullato."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Trasferimento completato."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Creazione cartella..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Il server non supporta SCCN/CPSV ma è richiesta una connessione dati SSL, "
+"trasferimento annullato!"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Trasferimento file \"%1\"..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Trasmissione segnale mantieni-attivo..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Disconnesso."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Tempo scaduto per la connessione."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Inattivo."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Scansione completata."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Avvio scansione ricorsiva cartelle..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Attesa di %1 secondi prima della riconnessione..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Attesa..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Tentativo di riconnessione (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Tentativo di riconnessione..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Tentativo annullato."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Azioni se esiste il file (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Dimensione/Orario"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Lo stesso"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Più vecchio"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Più recente"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Più piccolo"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Più grande"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Salta"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Sovrascrivi"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Continua"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Rinomina"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Chiedi"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Registro (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Sessione locale"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Registro"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Connessione con %1 stabilita correttamente."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Per favore fornisci la password per decifrare la tua chiave privata."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sessione"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Deve rimanere aperta almeno una sessione su ciascun lato."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+"Per favore concludi tutti i trasferimenti prima di chiudere la sessione."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Questa sessione è attualmente connessa. Sei sicuro di volerti disconnettere?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Chiudi sessione"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "&Connessione veloce..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nuova sessione"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "Lato &Sinistro"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Lato &Destro"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Modalità &trasferimento (Auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binario"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Modalità &trasferimento (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Modalità &trasferimento (Binario)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Seleziona..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Senza nome"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Trasferisci"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Descrizione"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Non ci sono trasferimenti non riusciti."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Ricomincia trasferimento"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Aggiungi alla coda"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Aggiungi tutto alla coda"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "R&imuovi"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Rimuovi tutto"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Sei sicuro di voler rimuovere questo trasferimento non riuscito?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Sei sicuro di voler rimuovere TUTTI i trasferimenti non riusciti?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nuovo schema"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Schema del nome file:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Colore:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Connessione veloce"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Pulisco la lista dei siti accessi recentemente?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "un nome di un host"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "una porta valida"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "il tuo nome utente"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "la tua password"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " e"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Per favore inserisci "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Per favore fornisci la password per decifrare il certificato X509."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Siti conosciuti"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Nessun sito pubblicato."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Schema"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Colore"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Aggiungi schema"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Abilitato"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Evidenziazione"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Non ancora implementato.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Lista esclusione"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Estensioni ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Generale"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Trasferimenti"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Visualizzazione"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Azioni"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtri"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Verifica somma di controllo"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Somma di controllo"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verifica completata!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Impossibile aprire il file con la somma di controllo oppure il file ha un "
+"formato non corretto!"
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filtro &abilitato"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Nessun filtro."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Su"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Giù"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Rinomina..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Nuovo"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Rinomina regola"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Rinomina regola \"%1\" in:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Condizioni"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Corrisponde a t&utti i seguenti"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Corrisponde ad uno de&i seguenti"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Trova e sostituisci"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Uso della banda"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Più"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Meno"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Pulisci"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "in stallo"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "in esecuzione"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "In attesa della connessione..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtro: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Origine"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Destinazione"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Avanzamento"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Velocità"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Non hai file in coda."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr "Limita velocità di scaricamento"
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "Scaricamento: "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr "Limita velocità di invio"
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "Invio: "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr "Conteggio processi di trasferimento per sessione"
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "Processi: "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Inizia trasferimento"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Annulla trasferimento"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Rimuovi &tutto"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Muovi &su"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Muovi &giù"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Muovi in &cima"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Muovi in &fondo"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Cambia info trasferimento"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Carica coda da fi&le"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Salva coda su file"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Inzia"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pausa"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Aggiungi trasferimento..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Trova e sostituisci..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Mostra &filtro"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Sito"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Sei sicuro di voler rimuovere i file in coda?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Sei sicuro di voler rimuovere TUTTI i file in coda?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Caricando una nuova coda cancellerai quella esistente. Sei sicuro di voler "
+"continuare?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Carica coda"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Sessione sito [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Processo %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "inattivo"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "disconnessione"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "connessione"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "trasferimento"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Stato"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Non ci sono processi attualmente in esecuzione."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Nessun segnalibro."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nuovo..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Rinomina"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Crea sottocategoria..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplica"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+"Per favore inserisci il tuo nome utente e password per connetterti al sito."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Sito:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Nome categoria"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Rinomina categoria:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nuovo nome categoria"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nuova categoria:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Nuovo server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Nuovo server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Sei sicuro di voler rimuovere questa categoria?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Sei sicuro di voler rimuovere questo server?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Impossibile caricate il plugin di importazione selezionato."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Il file selezionato non esiste o non è leggibile."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Importazione segnalibri completata."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Modifica..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Impostazioni SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importa..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Esporta..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Editor segnalibri FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Stai per esportare i segnalibri di KFTPGrabber. Quest'ultimi possono "
+"contenere password o certificati X509 sensibili. L'esportazione dei segnalibri "
+"può compromettere la tua sicurezza."
+"<br>"
+"<br>Sei sicuro?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Esporta segnalibri"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "Impossibile entrare nella cartella %1."
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Annulla"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Mostra vista ad albero"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Proprietà"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Distruggi"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Opzioni &filtro"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Salta &sempre questo file quando metti in coda"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Dai priorità m&assima a questo file"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Dai priorità m&inima a questo file"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Trasferisci"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Accoda trasferimento"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Crea cartella..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Apri file"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verifica..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "A&ltre azioni"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "Inserisci comando &manuale..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Esporta elenco cartelle..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Mostra file e cartelle &nascoste"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Apri la cartella corrente in &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Confronta oggetti &selezionati"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Confronta &cartelle"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Invia comando g&rezzo"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Cambia sito"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Connessione &rapida..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Connetti a"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Disconnetti"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Cambia la co&difica remota"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Vuoi staccare la connessione in corso?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Sei sicuro di voler DISTRUGGERE questo file?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Distruggi file"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Vuoi cancellare veramente questo oggetto?\n"
+"Vuoi cancellare veramente questi %n oggetti?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Elimina file"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Salta \"%1\""
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Priorità \"%1\""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Crea cartella"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Nome cartella:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Invia comando grezzo"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Comando:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Esporta elenco cartelle"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"I file identici sono stati nascosti in entrambi i lati. Sono visibili solo i <b>"
+"file diversi</b>."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Generale"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Cartella remota"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tipo:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Posizione:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Dimensione:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Creato:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Permessi"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Permessi accesso"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Classe"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Mostra\n"
+"Voci"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Lettura"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Scrivi\n"
+"Voci"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Scrittura"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Entra"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Esec"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Speciale"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Utente"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Gruppo"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Altri"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Imposta UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Imposta GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Sticky"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Applica i cambiamenti a tutte le sottocartelle e ai loro contenuti"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Cartella root"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Percorso: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Questa è una connessione cifrata SSH. Attualmente non ci sono informazioni "
+"disponibili sul certificato."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Opzioni filtro"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Cartelle filtro"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Collegamenti simbolici filtro"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Distingui maiuscole"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "Registro eventi di <b>KFTPGrabber</b> inizializzato.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Impossibile aprire il file in scrittura."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Impossibile trovare il file XML di descrizione dell'interfaccia grafica %1. "
+"Per favore controlla di aver installato correttamente l'applicazione. Se hai "
+"delle domande per favore rivolgiti su %2."
+"<br> "
+"<br><b>Avvertimento:</b> L'interfaccia grafica corrente sarà incompleta!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Chiudendo la finestra principale KFTPGrabber si manterrà in esecuzione nel "
+"vassoio di sistema. Usa <b>Esci</b> dal menu <b>KFTPGrabber</b> "
+"per uscire dall'applicazione.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Agganciamento nel vassoio di sistema"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Attualmente c'è ancora 1 trasferimento in esecuzione.\n"
+"Attualmente ci sono ancora %n trasferimenti in esecuzione."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Sei sicuro di voler uscire?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Siti FTP conosciuti"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Siti in KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Modifica segnalibri..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Ricezione: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Invio: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Coda"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Trasferimenti non riusciti"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Siti conosciuti"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Processi"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Traffico"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Copia di"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Questo file dei segnalibri è cifrato. Per favore inserici una chiave per "
+"decifrarlo."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>La decifrazione del file dei segnalibri non è riuscita con la chiave "
+"fornita. Vuoi <b>sovrascrivere</b> i segnalibri con un file vuoto?"
+"<br>"
+"<br><font color=\"red\"><b>Attenzione:</b> se sovrascrivi, tutti i segnalibri "
+"attuali andranno persi.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Decifrazione non riuscita"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "S&ovrascrivi segnalibri"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Inserisci una chiave per cifrare il file dei segnalibri."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Nessun servizio pubblicato>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD non disponibile>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Nessun sito in KWallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Visual&izza"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Sfoglia file"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Mostra file e cartelle &nascoste"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Mostra l'albero delle &cartelle"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Mostra le di&mensioni in byte (attiva/disattiva il formato più \"leggibile\")"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Mostra il pr&oprietario ed il gruppo di ciascun file"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Mostra dimen&sione cartelle"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "Elementi a&ltra interfaccia"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Mostra barra laterale sinistra"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Cerca e sostituisci nella coda"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Attraverso questa finestra di dialogo puoi eseguire una sostituzione di massa "
+"di tutti i percorsi di origine/destinazione dei trasferimenti in coda. <b>"
+"I cambiamenti non possono essere annullati.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Cosa cercare"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destinazione:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Origine:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Cerca solo trasferimenti in un server specifico"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Info server"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Nome server:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Password:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Nome utente:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Porta:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Sostituisci con"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Procedura guidata importazione segnalibri"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Passo 1: <b>Seleziona il plugin di importazione</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Immagine"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Per favore seleziona il plugin di importazione adeguato nella lista "
+"sottostante. Ogni plugin può importare un formato diverso."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Plugin di importazione disponibili:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Passo 2 <b>Seleziona un file dei segnalibri da importare</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Per favore seleziona il file dei segnalibri dal quale vuoi importare i tuoi "
+"segnalibri. Un percorso predefinito è già stato determinato dal plugin."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Percorso segnalibri:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Passo 3 <b>Importazione segnalibri...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Per favore attendi mentre vengono importati i segnalibri."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Avanzamento:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Aspetto"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Colori e caratteri"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Carattere:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Colore comandi client:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Colore risposta del server:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Colore risposta multi linea:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Colore messaggio d'errore:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Colore messaggio di stato:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Output"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&File output"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Salva registro su file"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "File output:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Info server origine"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Info server destinazione"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Origine:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Destinazione:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Tipo trasferimento:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Co&nnessione"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP connessione attiva"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Forza PORT/EPRT ad &usare l'indirizzo IP configurato"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "Nome host / indirizzo IP:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "&Ignora IP esterno durante le connessioni LAN"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Intervallo porte connessione attiva"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Usa so&lo le porte contenute nell'intervallo specificato"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Porta minima:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Porta massima:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Tempi massimi"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Tempo max controllo connessione (in sec.):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Tempo max trasferimento dati (in sec.):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Limite velocità"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Ricezione (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Invio (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Spazio su dis&co"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Controlla spazio libero su disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Arresta il trasferimento se &non c'è sufficiente spazio libero"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervallo (sec):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Spazio libero minimo (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Proc&essi"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Numero di processi per sessione:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Usa la connessione primaria per i trasferimenti"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Varie"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Riprova automaticamente i trasferimenti non riusciti"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Numero massimo di tentativi prima di marcare come non riuscito:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Altro"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "&Accoda file (invece di trasferire) quando \"trascini e rilasci\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Salta direct&ory vuote quando metti in coda"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Chiedi conferma &prima di disconnettere"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Nome host:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocollo:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP su TLS/SSL (esplicito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP su TLS/SSL (implicito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP su SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Etichetta sito:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Cartella remota:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Cartella locale:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Accesso anonimo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Avanzato"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Disatti&va l'uso della modalità passiva estesa"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Disattiva l'uso della modalità passiva"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Usa IP del sito per connesioni in modalità passiva"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+"Disabilita per questo sito \"forza modalità attiva per usare questo IP\""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Usa STAT per l'elenco cartelle"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Processi trasferimento multiplo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Non usare i trasferimenti multipli per questo sito"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Codifica server"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Codifica:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Riprova e man&tieni-attivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "R&iprova a connetterti quando non riesci"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Riprova"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Numero di tentativi (0 = infiniti):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Ritardo tentativo:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Usa i pacchetti mantieni-attivo per mantenere aperta la connessione"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Mantieni-attivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Frequenza mantieni-attivo (secondi):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "E&stensioni ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Aggiungi estensione"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Estensione:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Estensione"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Connessioni recenti"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Seleziona connessione:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Inserisci l'intero URL in questa casella"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Inserisci il nome dell'host ftp"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Accesso ano&nimo"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Controlla accessi anonimi"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Inserisci il nome utente per l'account"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Inserisci password per l'account"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Aggiungi ai &segnalibri"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avanzato"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Impostazioni connessione dati"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Modalità:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Cifra sempre il canale dati"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Cifra solo per l'elenco cartelle"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Non cifrare il canale dati"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Certificato X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Usa i seguenti certificati SSL per la connessione"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Percorso:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "&Indirizzo di posta elettronica"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Usa l'indirizzo di posta elettronica dal centro di controllo"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Indirizzo di posta elettronica:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Avvio e uscita"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Chiedi conferma prima di us&cire se ci sono trasferimenti attivi"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Avvia il programma minimi&zzato nel vassoio di sistema"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Mostra &schermata di benvenuto all'avvio"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Mostra icona nel vassoio di s&istema"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Esc&i quando fai clic sul pulsante X"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Impostazioni predefinite sito"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "C&ifra file segnalibri"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "&Mostra siti di KWallet tra i segnalibri"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Notifica"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Fumetti"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "&Mostra fumetto quando termina il trasferimento"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Mostra solo quando la &coda si svuota dopo il trasferimento"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Mostra fumetto quando il tentativo di r&iconnessione riesce"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>File:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "nessuno"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Lista file"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Non elaborato"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Ok"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Non trovato"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Non riuscito"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "La dimensione della finestra principale."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "La posizione della finestra principale nello schermo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Conteggio tentativi predefinito per i nuovi siti."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Ritardo tentativi predefinito per i nuovi siti."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+"Se debba essere visualizzato un fumetto quando alcune azioni sono completate."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Se debba essere visualizzato un fumetto quando tutti i trasferimenti in coda "
+"terminano."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Se debba essere visualizzato un fumetto quando la connessione al server viene "
+"stabilita correttamente dopo dei tentativi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+"Se l'utente debba confermare l'uscita quando ci sono trasferimenti in corso."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Stato di cifratura dei file segnalibri."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Cartella locale predefinita."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+"Se l'applicazione debba chiudersi quando l'utente fa clic sul pulsante X."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Se l'applicazione debba essere avviata minimizzata."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+"Se debba essere visualizzata la schermata di benvenuto quando si avvia "
+"l'applicazione."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Se debba essere mostrata l'icona nel vassoio di sistema."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Se debbano essere mostrati i siti di KWallet tra i segnalibri."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Se debba essere mostrata una finestra di dialogo di conferma ogni volta che "
+"viene richiesta una disconnessione."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "La codifica predefinita del sito."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Siti accessi recentemente via connessione rapida."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Una lista di motivi di file dove la modalità ASCII debba essere usata per il "
+"trasferimento."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Se debbano essere saltate le cartelle vuote."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Il carattere che dev'essere usato per l'area di registro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Il colore dei comandi inviati al server."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Il colore delle risposte del server."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Il colore delle risposte multilinea del server."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Il colore dei messaggi d'errore."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Il colore dei messaggi di stato."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Se il registro debba essere scritto anche in un file."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Il file in quale il registro debba essere scritto."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Se debba essere selezionata una porta da un intervallo di porte specificato per "
+"i trasferimenti attivi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "L'inizio dell'intervallo delle porte."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "La fine dell'intervallo delle porte."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+"Se debba essere ignorato un IP quando si eseguono trasferimenti attivi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "L'IP che dev'essere inviato quando si ignora il comando PORT."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+"Se debba essere ignorato l'indirizzo IP esterno durante le connesioni LAN."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Se i trasferimenti, invece di iniziare, debbano essere messi in coda quando si "
+"trascina e rilascia."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Se kftpgrabber debba controllare lo spazio libero e annullare il trasferimento "
+"quando non c'è abbastanza spazio."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Intervallo per il controllo disco."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Spazio libero minimo (in MiB) che dev'essere disponibile."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"Usa l'indirizzo globale di posta elettronica di KDE per le password anonime."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+"L'indirizzo di posta elettronica che dev'essere usato come password anonime."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Numero di processi da usare nel trasferimento."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Se debba essere usata la connessione primaria per i trasferimenti."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tempo massimo (in sec.) per il controllo della connessione."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tempo massimo (in sec.) per i trasferimenti dati."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Limite globale di velocità di scaricamento (KB/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Limite globale di velocità di invio (KB/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+"Se debbano essere riprovati automaticamente i trasferimenti non riusciti."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"Numero massimo di tentativi prima di marcare un trasferimento come non "
+"riuscito."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+"Se debba essere mostrato l'albero delle cartelle in maniera predefinita."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Se debbano essere mostrati i file nascosti quando si sfoglia."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Se le dimensioni dei file debbano essere mostrate in byte invece che in forma "
+"più \"leggibile\"."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+"Se debbano essere mostrati il proprietario e il gruppo di ciascun file."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Mostra dimensione cartella."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Mostra barra laterale sinistra."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Menu principale"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barra degli strumenti Segnalibri"
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/kftpgrabber.po b/translations/ja/messages/kftpgrabber.po
new file mode 100644
index 0000000..1145732
--- /dev/null
+++ b/translations/ja/messages/kftpgrabber.po
@@ -0,0 +1,2905 @@
+# translation of kftbgrabber.po to Japanese
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+# Yukiko BANDO <ybando@k6.dion.ne.jp>, 2005-2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-04-12 20: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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "含む"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "含まない"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "等しい"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "等しくない"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "正規表現にマッチする"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "正規表現にマッチしない"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "である"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "でない"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "ディレクトリ"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "より大きい"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "より小さい"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "バイト"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "動作を選んでください。"
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "優先度:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "ダウンロード"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "アップロード"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr "<qt>要求された操作が失敗しました。サーバからの応答:<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr "<qt>応答を解析するための <b>%1</b> という名前のハンドラが見つかりません。</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "ファイル名"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "エントリの種類"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "サイズ"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "優先度を変更"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "待ち行列に入れない"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "リストビューで色付けする"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "リストビューに表示しない"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "転送先の名前を小文字に変更"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "名前のないルール"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP インポート"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber インポート"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp インポート"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla 3 インポート"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "待ち行列の転送がすべて完了しました。"
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "ファイルは存在します"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - KDE のための FTP クライアント"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "主要開発者"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "開発者"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH のコード"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc のコード"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBallon ポップアップのコード"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "トラフィックグラフのウィジェット"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "アイコンのデザイン"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "テストとデバッグ"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "ディレクトリパーサーコード"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "リストビューのカラムの扱いに関するコード"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "以下のファイル転送が完了しました:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "サーバへの接続に失敗しました。"
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "サーバへのログインに失敗しました。"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "ソースファイルが見つかりません。"
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "許可が得られませんでした。"
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr "読み込みまたは書き込みのためにファイルを開けません。"
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "何らかの理由で転送が失敗しました。"
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr "%1 に十分な空き容量がないので、次のファイル転送を中止しました:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "SSH 接続を確立できません (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "ログイン中..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "サーバへの接続完了、ログインを試みています..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "ログインに失敗しました。"
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "キーボードによる対話式認証に成功しました。"
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "公開鍵による認証に成功しました。"
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "SFTP チャンネルを初期化できません。"
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "SFTP を初期化できません。"
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "接続しました。"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "接続中..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "%1:%2 に接続中..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "中止しました。"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "キャッシュのディレクトリ一覧を使用。"
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "ディレクトリ一覧を取得中..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "転送中..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "ファイル %1 をダウンロード中..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "ファイル %1 をアップロード中..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "削除中..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "名前変更..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "モードを変更..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "接続に失敗しました。"
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr "SSL ネゴシエーションに成功。接続は %1 ビット暗号 %2 で保護されています。"
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL ネゴシエーションに失敗。ログインを中止しました。"
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL ネゴシエーション要求に失敗。ログインを中止しました。"
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL ネゴシエーションに失敗。接続を中止しました。"
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "サーバと接続しました。ウェルカムメッセージを待っています..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "接続失敗 (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr "PORT に非互換のアドレスファミリ、EPRT がサポートされていません、中止します。"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "%1:%2 とのデータ接続を確立中..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "待ち受けソケットを確立できません。"
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "ポート %1 でデータ接続を待っています..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "データ接続を確立しました。"
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "データチャンネルは %1 ビットSSLで保護されています。"
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr "データチャンネルの SSL ネゴシエーションに失敗しました。転送を中止します。"
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "転送完了"
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "ディレクトリを作成..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr "サーバは SSCN/CPSV をサポートしていませんが、SSL データ接続が要求されました。転送を中止します。"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "ファイル '%1' を転送中..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "keepalive パケットを送出..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "切断しました。"
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "接続がタイムアウトしました。"
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "アイドル中"
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "スキャン完了"
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "再帰的ディレクトリスキャンを開始..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "%1 秒後に接続を再試行します..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "待機中..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "接続を再試行 (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "接続を再試行..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "再試行を中止しました"
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "同名ファイルが存在する場合の動作 (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "サイズ/タイムスタンプ"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "同じ"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "古い"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "新しい"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "小さい"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "大きい"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "スキップ"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "上書き"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "再開"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "名前変更"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "確認"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "ログ (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "ローカルセッション"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "ログ"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "%1 との接続を確立しました。"
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "秘密鍵の解読パスワードを入力してください。"
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "セッション"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "それぞれの側に最低一つのセッションを開いておかなければなりません。"
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "セッションを終了する前にすべての転送を完了してください。"
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "このセッションは接続中です。本当に切断しますか?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "セッションを閉じる"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "クイック接続(&C)..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "新規セッション(&N)"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "左側(&L)"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "右側(&R)"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "自動転送モード(&T)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "バイナリ"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "自動"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "ASCII 転送モード(&T)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "バイナリ転送モード(&T)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "選択..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "名前なし"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "転送"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "説明"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "失敗した転送はありません。"
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "転送を再開(&R)"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "待ち行列に追加(&A)"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "すべて待ち行列に追加"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "削除(&E)"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "すべて削除"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "本当にこの失敗した転送を削除しますか?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "本当に失敗した転送をすべて削除しますか?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "フォーム1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "新規パターン"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "ファイル名パターン:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "色:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "クイック接続"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "最近アクセスしたサイトのリストをクリアしますか?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "ホスト名"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "有効なポート"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "あなたのユーザ名"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "あなたのパスワード"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " かつ"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "入力してください"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "X509 証明書の復号パスワードを入力してください。"
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "公開されたサイトはありません。"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "パターン"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "色"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "パターンを追加"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "有効"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "強調表示"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "まだ実装されていません"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "スキップリスト"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII 拡張子"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "全般"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "転送"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "表示"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "動作"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "フィルタ"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "チェックサム検証"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "チェックサム"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "検証完了"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "チェックサムファイルを開けません、あるいはファイルの形式が不正です。"
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "フィルタを有効にする(&E)"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "フィルタがありません。"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "上へ"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "下へ"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "名前変更..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "新規"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "ルールの名前を変更"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "ルール '%1' の名前を変更:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "条件"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "以下のすべてにマッチ(&L)"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "以下のいずれかにマッチ(&Y)"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "検索と置換"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "帯域幅の使用"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "増やす"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "減らす"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "クリア"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "ストール"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "実行中"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "接続待ち..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "フィルタ: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "名前"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "転送元"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "転送先"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "進捗"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "速度"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "待ち行列にファイルはありません。"
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr "ダウンロード速度を制限"
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "下り: "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr "アップロード速度を制限"
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "上り: "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr "セッションあたりの転送スレッド数"
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "スレッド数: "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "転送開始(&S)"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "転送中止(&A)"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "すべて削除(&A)"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "上に移動(&U)"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "下に移動(&D)"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "一番上に移動(&T)"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "一番下に移動(&B)"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "転送情報を変更(&C)"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "ファイルから待ち行列を読み込む(&L)"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "待ち行列をファイルに保存(&S)"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "開始(&T)"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "一時停止(&P)"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "転送を追加(&A)..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "検索と置換(&S)..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "フィルタを表示(&F)"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "サイト"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "本当に待ち行列のファイルを削除しますか?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "本当にすべての待ち行列のファイルを削除しますか?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr "新しい待ち行列を読み込むと既存のものを上書きします。本当に続けますか?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "待ち行列を読み込む"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "サイトセッション [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "スレッド %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "アイドル"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "切断しました"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "接続中"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "転送中"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "状態"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "実行中のスレッドはありません。"
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "ブックマークがありません。"
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "新規(&N)..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "名前変更(&R)"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "サブカテゴリを作成(&C)..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "複製(&D)"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr "このサイトに接続するためのユーザ名とパスワードを入れてください。"
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "サイト:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "カテゴリ名"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "カテゴリ名を変更:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "新しいカテゴリの名前"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "新しいカテゴリ:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "新しいサーバ"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "新しいサーバ"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "本当にこのカテゴリを削除しますか?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "本当にこのサーバを削除しますか?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "選択されたインポートプラグインをロードできません。"
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "選択されたファイルは存在しないか、読み取り不可です。"
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "ブックマークのインポートが完了しました。"
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "編集(&E)..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLSの設定"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "インポート..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "エクスポート..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTPブックマークエディタ"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>あなたの KFTPGrabber "
+"ブックマークを送ろうとしています。ブックマークにはパスワードや慎重に取り扱うべきX509証明書が含まれているかもしれません。ブックマークを送ることは、それらの安"
+"全性を危うくする可能性があります。"
+"<br>"
+"<br>本当によろしいですか?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "ブックマークをエクスポート"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "フォルダ %1 に入れませんでした。"
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "中止(&A)"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "ツリー表示(&S)"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "プロパティ(&P)"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "シュレッダー(&S)"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "フィルタのオプション(&F)"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "このファイルは常に待ち行列に入れない(&S)"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "このファイルを最優先する(&T)"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "このファイルを一番後回しにする(&L)"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "転送(&T)"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "転送を待ち行列に入れる(&Q)"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "ディレクトリを作成(&C)..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "ファイルを開く(&O)"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "検証(&V)..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "その他の動作(&M)"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "コマンドを手入力(&M)..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "ディレクトリ一覧をエクスポート(&E)..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "隠しファイル/ディレクトリを表示(&H)"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "現在のディレクトリを Konqueror で開く(&K)..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "選択したアイテムを比較(&S)"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "ディレクトリを比較(&D)"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Raw コマンドを送信(&R)"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "サイトを変更(&C)"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "クイック接続(&Q)..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "接続(&C)"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "切断(&D)"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "リモートのエンコーディングを変更(&E)"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "現在の接続を中止しますか?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "本当にこのファイルをシュレッダーにかけますか?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "ファイルをシュレッダーにかける"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr "本当にこれら %n 項目を削除しますか?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "ファイルを削除"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "'%1' をスキップ"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "優先度 '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "ディレクトリを作成"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "ディレクトリ名:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Raw コマンドを送信"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "コマンド:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "ディレクトリ一覧をエクスポート"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr "両サイドで全く同じファイルを隠しました。「異なるファイル」のみが表示されています。"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "全般(&G)"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "リモートフォルダ"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "不明"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "タイプ:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "場所:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "サイズ:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "作成日:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "許可情報(&P)"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "アクセス許可情報"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "クラス"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"エントリを\n"
+"表示"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "読み取り"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"エントリを\n"
+"書き込み"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "書き込み"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "移動"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "実行"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "特別"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "ユーザ"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "グループ"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "その他"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "UID を設定"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "GID を設定"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "スティッキー"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "変更をすべてのサブフォルダとその内容に適用する"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "ルートディレクトリ"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "パス"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr "これは SSH 暗号化接続です。証明書情報は現在利用できません。"
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "フィルタのオプション"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "ディレクトリをフィルタ"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "シンボリックリンクをフィルタ"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "大文字小文字を区別する"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> logger を初期化しました。<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "書き込みのためにファイルを開けません。"
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>%1 XML GUI 記述ファイルが見つかりません。アプリケーションが正しくインストールされていることを確認してください。質問があれば %2 "
+"で聞いてください。"
+"<br>"
+"<br>警告: 現在の GUI は不完全なものになります。</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>メインウィンドウを閉じても KFTPGrabber はシステムトレイで実行し続けます。終了するには KFTPGrabber "
+"メニューから「終了」を選んでください。</p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "システムトレイにドッキング"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr "%n 件のファイル転送を実行中"
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"本当に終了しますか?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr ""
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "KWallet のサイト"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "ブックマークを編集..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "ダウンロード: %1/秒"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "アップロード: %1/秒"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "待ち行列"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "失敗した転送"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "スレッド"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "トラフィック"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "コピー"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "このブックマークファイルは暗号化されています。解読キーを入力してください。"
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>与えられたキーでブックマークの暗号を解読できませんでした。ブックマークを空のファイルで上書きしますか?"
+"<br>"
+"<br><font color=\"red\">警告: 上書きすると、現在のすべてのブックマークが失われます。</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "復号化に失敗"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "ブックマークを上書き(&O)"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "ブックマークファイル暗号キーを入力してください。"
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<公開されているサービスはありません>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD は利用できません>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<KWallet にサイトがありません>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Yukiko BANDO"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "yando@k6.dion.ne.jp"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "表示(&Y)"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "ファイルブラウザ(&B)"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "隠しファイル/ディレクトリを表示(&H)"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "ディレクトリツリーを表示(&D)"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "ファイルサイズをバイトで表示(&Z) (人間が読める形式に切り替え)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "ファイルの所有者とグループを表示(&O)"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "ディレクトリのサイズを表示(&S)"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "その他のインターフェース要素(&O)"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "左サイドバーを表示"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "待ち行列の検索と置換"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr "このダイアログを使うと、待ち行列の転送の転送元/転送先のパスをまとめて置換することができます。注意: 変更は元に戻せません。"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "検索"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "転送先:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "転送元:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "指定したサーバの転送のみを検索"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "サーバ情報"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "サーバ名:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "ホスト:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "パスワード:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "ユーザ名:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "ポート:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "次と置換"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "ブックマークインポートウィザード"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "ステップ 1: インポートプラグインを選択"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "画像"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr "下のリストから適切なインポートプラグインを選んでください。それぞれのプラグインは異なる形式からインポートします。"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "利用可能なインポートプラグイン:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "ステップ 2: インポートするブックマークファイルを選択"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr "ブックマークをインポートするブックマークファイルを選んでください。標準のパスがあらかじめ設定されています。"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "ブックマークのパス:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "ステップ 3: ブックマークをインポート..."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "ブックマークのインポートが完了するまでお待ちください。"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "インポートの進捗:"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "外観(&A)"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "フォントと色"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "フォント:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "クライアントコマンドの色:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "サーバからの応答の色:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "マルチライン応答の色:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "エラーメッセージの色:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "状態メッセージの色:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "出力(&O)"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "ファイル出力(&F)"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "ログをファイルに保存(&S)"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "出力ファイル:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "転送元サーバの情報"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "転送先サーバの情報"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "転送元:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "転送先:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "転送のタイプ:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "接続(&N)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "アクティブ接続の IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "PORT/EPRT に設定された IP の使用を強制(&U)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/ホスト名:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "LAN 接続で外部 IP を無視する(&I)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "アクティブ接続のポート範囲"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "指定したポート範囲内のポートのみを使う(&Y)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "最小のポート番号:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "最大のポート番号:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "タイムアウト"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "接続のタイムアウト (秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "データ転送のタイムアウト (秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "速度制限"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "ダウンロード (KB/秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "アップロード (KB/秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "ディスク容量(&K)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "ディスクの空き容量チェック"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "十分な空き容量がなければ転送を中止する(&N)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "チェックの間隔 (秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "最小空き容量 (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "スレッド(&A)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "セッション当たりのスレッド数:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "転送に一次接続を使う"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "その他(&M)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "失敗した転送を自動的に再試行する"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "失敗とマークするまでの最大試行回数:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "その他"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "ドラッグ&ドロップされたファイルは転送せずに待ち行列に入れる(&Q)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "空のディレクトリは待ち行列に入れない(&E)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "接続を切断する前に確認する(&B)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "FTP サイトのプロパティ"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "ホスト名:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "プロトコル:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP over TLS/SSL (明示的)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP over TLS/SSL (暗黙)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP over SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "サイト名:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "リモートディレクトリ:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "ローカルディレクトリ:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "匿名ログイン(&A)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "詳細(&A)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "拡張パッシブモードの使用を無効にする(&B)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "パッシブモードを無効にする"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "パッシブモード接続にサイトの IP を使う"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "ディレクトリリスティングに STAT を使う"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "マルチスレッド転送"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "このサイトにはマルチスレッドを使わない"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "サーバのエンコーディング"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "エンコーディング:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "再試行と Keepalive(&K)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "接続に失敗したら再試行する(&Y)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "再試行"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "再試行の回数 (0 = 無制限):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "再試行の遅延:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "接続を保つために keepalive パケットを使う"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Keepalive"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Keepalive 周期 (秒):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII 拡張子(&X)"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "拡張子を追加"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "拡張子:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "拡張子"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "最近の接続"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "接続を選択:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "完全な URL をこのボックスに入力してください"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "FTP のホスト名を入力"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "匿名ログイン(&Y)"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "匿名ログインをチェックする"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "アカウントのユーザ名を入力"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "アカウントのパスワードを入力"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "ブックマークに追加(&B)"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "詳細"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "データ接続の設定"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "モード:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "データチャンネルを常に暗号化する"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "ディレクトリリスティングでのみ暗号化する"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "データチャンネルを暗号化しない"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 証明書"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "接続時に次の SSL 証明書を使用"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "パス:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "メールアドレス(&A)"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "コントロールセンターのメールアドレスを使う(&U)"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Eメール:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "開始と終了"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "実行中の転送があればプログラムを終了する前に確認する(&X)"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "プログラムをシステムトレイに最小化して起動(&Z)"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "起動時にスプラッシュスクリーンを表示(&S)"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "システムトレイアイコンを表示(&Y)"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "X ボタンをクリックして終了する(&I)"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "サイトの標準設定"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "ブックマークファイルを暗号化(&Y)"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "KWallet のサイトをブックマークに表示(&S)"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "通知(&N)"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "バルーン"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "転送が完了したらバルーンを表示(&S)"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "待ち行列が空になったときにのみバルーンを表示(&Q)"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "接続の再試行が成功したらバルーンを表示(&Y)"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "ファイル:"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "なし"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "ファイルリスト"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "未処理"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "OK"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "見つかりません"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "失敗"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "メインウィンドウのサイズ"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "メインウィンドウのスクリーン上の位置"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "新しいサイトでの標準再試行回数"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "新しいサイトでの再試行の遅延"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "何かの動作が完了したときにバルーンを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "待ち行列のすべての転送が完了したときにバルーンを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr "再試行でサーバとの接続が確立されたときにバルーンを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "転送が実行中であればプログラムを終了する前にユーザに確認します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "ブックマークファイルの暗号化の状態"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "標準のローカルディレクトリ"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "ユーザが X ボタンをクリックしたときにアプリケーションを終了します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "最小化してアプリケーションを開始します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "アプリケーションの起動時にスプラッシュスクリーンを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "システムトレイにアイコンを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "KWallet のサイトをブックマークに表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr "切断が要求されるたびに「切断を確認」のダイアログを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "サイトの標準エンコーディング"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "クイック接続で最近アクセスしたサイト"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr "転送にASCIIモードを使用するファイルパターンのリスト"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "空のディレクトリをスキップします。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "ログに使用するフォント"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "サーバに送信するコマンドの色"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "サーバからの応答の色"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "サーバからのマルチライン応答の色"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "エラーメッセージの色"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "状態メッセージの色"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "ログをファイルにも記録します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "ログを記録するファイル"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "ポート範囲の最低値"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "ポート範囲の最大値"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "PORT コマンドをオーバーライドするときに送る IP"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "LAN 接続で外部 IP を無視します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr "ドラッグ&ドロップを使用したときに転送を開始せずに待ち行列に入れます。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr "Kftpgrabber がディスク容量をチェックして十分な空き容量がなければ転送を中止します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "ディスクの空き容量を確認する間隔"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "最低限必要な空き容量 (MiB)"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "KDE のグローバルメールアドレスを匿名パスワードに使用します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "匿名パスワードに使用するメールアドレス"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "転送時に使用するスレッドの数"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "転送に一次接続を使用します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "データ転送のタイムアウト (秒)"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "全体的なダウンロード速度の制限 (kbytes/秒)"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "全体的なアップロード速度の制限 (kbytes/秒)"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "失敗した転送を自動的に再試行します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr "転送を失敗と見なすまでの最大試行回数"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "ディレクトリツリーを標準で表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "ブラウザに隠しファイルを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr "ファイルサイズを人間が読める形式ではなくバイトで表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "それぞれのファイルの所有者とグループを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "ディレクトリのサイズを表示します。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "左サイドバーを表示します。"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "メインメニュー"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "ブックマークツールバー"
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/kftpgrabber.po b/translations/ka/messages/kftpgrabber.po
new file mode 100644
index 0000000..f1e1739
--- /dev/null
+++ b/translations/ka/messages/kftpgrabber.po
@@ -0,0 +1,3616 @@
+# translation of kftpgrabber.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: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-03-28 01:33+0400\n"
+"Last-Translator: Giasher <giasher@telenet.ge>\n"
+"Language-Team: Georgian <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"
+"X-Poedit-Language: Georgian\n"
+"X-Poedit-Country: GEORGIA\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "დაკავშირება"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "დირექტორია"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "პრიორიტეტი"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "ჩამოტვირთვა"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "ატვირთვა"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "ფაილის სახელი"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "ზომა"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "გვერდის შ&ეცვლა"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "დაშორება"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP იმპორტი"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber იმპორტი"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp იმპორტი"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "ყველა რიგში მდგომი გადაცემა დასრულდა."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "ფაილი არსებობს"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - KDE-ს FTP კლიენტი"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "ლიდერი დამმუშავებელი"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "პროგრამისტი"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH კოდი"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc კოდი"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon მხტუნავი კოდი"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "ტრაფიკის გრაფიკის ელემენტი"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "ხატულის დიზაინი"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "გამოცდა და განბზიკვა"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "დირექტორიის სახელი:"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "შემდეგი ფაილების გადაცემა დასრულდა:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "კავშირი '%1'-სთან ვერ შედგა."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "ფაილის გადაცემა ვერ შედგა."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "წყაროს ფაილი ვერ მოიძებნა."
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "უფლებები"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "ფაილის ჩასაწერად გახსნა შეუძლებელია."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"შემდეგი ფაილების გადაცემა <b>შეწყვეტილ იქნა</b> რადგან '%1'-ზე არაა დარჩენილი "
+"საკმარისი თავისუფალი ადგილი:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "SSH კავშირის დამყარება შეუძლებელია (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "შესვლა..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "შესვლა ვერ შედგა."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "SFTP არხის ინიციალიზაცია შეუძლებელია."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "SFTP-ს ინიციალიზაცია შეუძლებელია."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "კავშირის გაწყვეტა"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "დაკავშირება...."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "მიმდინარეობს დაკავშირება '%1:%2'..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "შეწ&ყვეტა"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "გამოიყენება დირექტორიის ქეშირებული სია."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "დირექტორიის სიის მიღება..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "გადაცემა..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "დირექტორიების წაშლა..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "კავშირი '%1'-სთან ვერ შედგა."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "დაკავშირება შეუძლებელია."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "დაკავშირების თავიდან ცდა (%1/%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "TLS კავშირის დამყარება შეუძლებელია."
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "კავშირის მოლოდინი..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "კავშირი დამყარებულია."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "FXP.გადაცემა დასრულდა."
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "დირექტორიების სკანირება..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "გადაცემა..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "კავშირის გაწყვეტა"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "კავშირი '%1'-სთან ვერ შედგა."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "უქმი."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "შემოწმება დასრულდა!"
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "დირექტორიის სიის მიღება..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "თავიდან დაკავშირებამდე %1 წამი ლოდინი..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "დაკავშირება...."
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "დაკავშირების თავიდან ცდა..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "დაკავშირების თავიდან ცდა..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "თავიდან ცდა შეწყდა."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "ფაილზე არსებობს მოქმედებები (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "ზომა/დროის შტამპი"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "იგივე"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "უფრო ძველი"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "უფრო ახალი"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "უფრო პატარა"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "უფრო დიდი"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "გაცდენა"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "გადაწერა"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "გაგრძელება"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "სახელის გადარქმევა"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "კითხვა"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "ჟურნალი (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "ლოკალური სესია"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "ჟურნალი"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "კავშირი %1-სთან წარმატებით დამყარდა."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "გთხოვთ მოგვაწოდოთ პირადი გასაღების გაშიფვრვის პაროლი."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "სესია"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "თითო მხარეს ერთი სესია მაინც უნდა იყოს ჩართული."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "სესიის დახურვამდე დაასრულეთ ყველა გადაცემა."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"ეს სესია დაკავშირებულია. დარწმუნებული ხართ რომ გსურთ კავშირის გაწყვეტა?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "სესიის დახურვა"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "სწრაფი &დაკავშირება..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&ახალი სესია"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "მარ&ცენა მხარე"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "მარ&ჯვენა მხარე"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&გადაცემის რეჟიმი (ავტო)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "ორობითი"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "ავტო"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&გადაცემის რეჟიმი (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&გადაცემის რეჟიმი (ორობითი)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "ამორჩევა..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "უსახელო"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "გადაცემა"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "აღწერა"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "არ შემდგარი გადაცემები არაა."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "გადაცემის &თავიდან დაწყება"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "რიგში დამატე&ბა"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "ყველას რიგში დამატება"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "წ&აშლა"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "ყველას წაშლა"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "დარწმუნებული ხართ რომ გსურთ ამ არ შემდგარი გადაცემის წაშლა?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "დარწმუნებული ხართ რომ გსურთ ყველა არ შემდგარი გადაცემის წაშლა?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "ახალი შაბლონი"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "ფაილის სახელი შაბლონი:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "ფერი:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "სწრაფად დაკავშირება"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "ჰოსტის სახელი"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "მართებული პორტი"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "თქვენი მომხმარებლის სახელი"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "თქვენი პაროლი"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " და"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "გთხოვთ შეიყვანოთ "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "გთხოვთ მოგვაწოდოთ თქვენი X509 სერტიფიკატის გაშიფრვის პაროლი."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "თქვენთან ახლოს საიტები"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "საიტები არაა გამოქვეყნებული."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "შაბლონი"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "ფერი"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "შაბლონის დამატება"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "ჩართული"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "მარკირება"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>ჯერ არაა დანერგილა.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "სიის გაცდენა"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII xtensions"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "საერთო"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "გადაცემები"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "ჩვენება"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "მოქმედებები"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "ფილტრები"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Checksum შემმოწმებელი"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Checksum"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "შემოწმება დასრულდა!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "checksum ფაილის გახსნა შეუძლებელია, ან იგი არასწორ ფორმატშია!"
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "ფაილის სახელი"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "ფილტრები"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "ჩამოტვირთვა"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "სახელის გადარქმევა"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "უფრო ახალი"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "სახელის გადარქმევა"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "კა&ვშირი"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "ძიება და ჩანაცვლება"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "გამტარობის გამოყენება"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "გაყინული"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "გაშვებული"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "კავშირის მოლოდინი..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "ფილტრი:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "სახელი"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "წყარო"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "დაშორება"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "პროგრესი"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "სიჩქარე"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "თქვენ არ გაქვთ ფაილები რიგში."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "ჩამოტვირთვა"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "ძაფები"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "გადაცემა &დაწყება"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "გადაცემის შე&წყვეტა"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "&ყველას წაშლა"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "&ზემოთ ატანა"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "&ქვემოთ ჩატანა"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "&ზემოთ ატანა"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "გ&ადაცემის ინფორმაციის შეცვლა"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "რიგის ფაილიდან ჩა&ტვირთვა"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "რიგის ფაილში შ&ენახვა"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&გაშვება"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&პაუზა"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "გადაცემის &დამატება..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "ძ&იება და ჩანაცვლება..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "ფილტრის ჩვე&ნება"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "საიტი"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "დარწმუნებული ხართ რომ გსურთ რიგში არსებული ფაილ(ებ)ის წაშლა?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "დარწმუნებული ხართ რომ გსურთ რიგში არსებული ყველა ფაილის წაშლა?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"ახალი რიგიც ჩატვირთვა გადაეწერება არსებულს; დარწმუნებული ხართ რომ გსურთ "
+"გაგრძელება?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "რიგის ჩატვირთვა"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "საიტის სესია [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "ძაფი %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "უქმი"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "კავშირის გაწყვეტა"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "დაკავშირება"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "გადაცემა"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "სტატუსი"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "ახლა არცერთი ძაფი არაა გაშვებული."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "სანიშნეები არაა."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&ახალი..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "სახელის &გადარქმევა"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "ქვე&კატეგორიის შექმნა..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&დუბლირება"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "საიტი"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "კატეგორიის სახელი"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "კატეგორიის სახელის გადარქმევა:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "ახალი კატეგორიის სახელი"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "ახალი კატეგორია:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "ახალი სერვერი"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "ახალი სერვერი"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "დარწმუნებული ხართ რომ გსურთ ამ კატეგორიის წაშლა?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "დარწმუნებული ხართ რომ გსურთ ამ სერვერის წაშლა?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "არჩეული იმპორტის მოდულის ჩატვირთვა შეუძლებელია."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "არჩეული ფაილი არ არსებობს, ან წაუკითხვადია."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "სანიშნეთა იმპორტირება დასრულდა."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&რედაქტირება..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS პარამეტრები"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "იმპორტი..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "ექსპორტი..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP სანიშნეთა რედაქტორი"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>თქვენ აპირებთ KFTPGrabber სანიშნეების ექსპორტს. ისინი შეიძლება შეიცავდეს "
+"პაროლებს, ან მგძნობიარე X509 სერტიფიკატებს: ამ სანიშნეების ექსპორტი არა "
+"უსაფრთხო."
+"<br>"
+"<br>დარწმუნებული ხართ?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "სანიშნეთა ექსპორტი"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "შეწ&ყვეტა"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "ხის &ხედის ჩვენება"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "თ&ვისებები"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&განადგურებული"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "ფილტრები"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "რიგში ყოფნისას ფაილთა პრიორიტეტების სია."
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&გადაცემა"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "გადაცემათა &რიგი"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "დირექტორიის შ&ექმნა..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&ფაილის გახსნა"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "შ&ემოწმება"
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&მეტი მოქმედებები"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "დირექტორიის სიის &ექსპორტი..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "&დამალული ფაილების და დირექტორიების ჩვენება"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "დირექტორიის შექმნა"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "ნედლი ბრძანების გაგზავნა "
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "გვერდის შ&ეცვლა"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&სწრაფი დაკავშირება..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&დაკავშირება"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&გათიშვა"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "დაშორებული კ&ოდირების შეცვლა"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "გსურთ მიმდინარე კავშირის გაწყვეტა?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "ნამდვილად გსურთ ამ ფაილის განადგურება?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "ფაილის განადგურება"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "ფაილის წაშლა"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "გაცდენა"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "პრიორიტეტი"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "დირექტორიის შექმნა"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "დირექტორიის სახელი:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "ნედლი ბრძანების გაგზავნა "
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "ბრძანება:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "დირექტორიის სიის ექსპორტი"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "ზო&გადი"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "დაშორებული საქაღალდე"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "უცნობი"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "ტიპი:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "მდებარეობა:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "ზომა:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "შექმნილია:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&უფლებები"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "წვდომის უფლებები"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "კლასი"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"ჩანაწერების\n"
+"ჩვენება"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "წაკითხვა"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"ჩანაწერების\n"
+"ჩაწერა"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "ჩაწერა"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "შესვლა"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "შესრ."
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "სპეციალური"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "მომხმარებელი"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "ჯგუფი"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "სხვები"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "UID მინიჭება"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "GID მინიჭება"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "მიმაგრებული"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "ძირეული დირექტორია"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "გეზი:"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"ეს არის SSH-ით დაშიფრული კავშირი. სერტიფიკატის შესახებ ცნობები მიუწვდომელია."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "ფილტრები"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "დირექტორიის შექმნა"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "ფაილთა სია"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "გვერდის შ&ეცვლა"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b> KFTPGrabber</b> ჟურნალი დაიწყო.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "ფაილის ჩასაწერად გახსნა შეუძლებელია."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>%1 XML GUI descriptor ფაილი ვერ მოიძებნა. პთხოვთ შეამოწმოთ რომ პროგრამა "
+"სწორად გაქვთ დაყენებული! თუ რაიმე კითხვები გაქვთ გთხოვთ %2-ზე იკითხოთ."
+"<br>"
+"<br><b>გაფრთხილება:</b> მიმდინარე GUI არასრული იქნება!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>KFTPGrabber-ის მთავარი ფანჯრის დახურვის შემდეგ, იგი დარჩება სისტემურ "
+"პანელსი. გამოიყენეთ <b>გასვლა</b> <b>KFTPGrabber</b> "
+"მენიუდან პროგრამიდან გასასვლელად.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "სისტემურ პანელზე დამყარება"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr "ახლა %n გადაცემაა გაშვებული."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"ნამდვილად გსურთ გასვლა?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP გვერდები სიახლოვეში"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "გვერდები ზარდახშაში"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "სანიშნეების რედაქტირება..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "ჩამოტვირთვა: %1/წ"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "ატვირთვა: %1/წ"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "რიგი"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "გადაცემა ვერ განხორციელდა"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "გვერდები ჩემგან ახლოს"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "ძაფები"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "ტრაფიკი"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "ასლი"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"ეს სანიშნეთა ფაილი დაშიფრულია. გთხოვთ შეიყვანოთ გასაღები გაშიფრვისთვის."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>მოწოდებული გასაღებით სანიშნეთა ფაილის გაშიფრვა ვერ განხორციელდა. გსურთ <b>"
+"გადააწეროთ</b> სანიშნეებს ცარიელი ფაილი?"
+"<br>"
+"<br><font color=\"red\"><b>გაფრთხილება:</b> თუ გადააწერთ, მიმდინარე სანიშნეები "
+"დაიკარგება.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "გაშიფვრვა ვერ განხორციელდა"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "სანიშნეების &გადაწერა"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "სანიშნეთა ფაილის გასაშიფრი გასაღები შეიყვანეთ."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "რუსუდან ცისკრელი,Rusudan Tsiskreli"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "tsiskreli@gmail.com,r_tsiskreli@caucasus.net"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "ჩ&ვენება"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "ფაილთა &ბროუზერი"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "&დამალული ფაილების და დირექტორიების ჩვენება"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "&დირექტორიათა ხის ჩვენება"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"ფაილთა ზომის &ბაიტებში ჩვენება (\"ადამიანისთვის წაკითხვად\" რეჟიმზე გადართვა)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "ყოველი ფაილის &პატრონის და ჯგუფის ჩვენება"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "&დირექტორიათა ხის ჩვენება"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "ფილტრის ჩვე&ნება"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "რიგში ძიება და ჩანაცვლება"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"ამ დიალოგის გამოყენებით თქვენ შეგიძლიათ საწყისი და დანიშნულების გეზების "
+"მასივების ჩანაცვლებს <b>ცვლილებების გაუქმება შეუძლებელია.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "რისი ძიება"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "დანიშნულების ადგილი:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "წყარო:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "გადაცემის მხოლოდ მითითებულ სერვერზე ძიება"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "სერვერის ინფორმაცია"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "სერვერის სახელი:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "მასპინძელი სერვერი:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "პაროლი:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "მომხმარებლის სახელი:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "პორტი:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "ჩანაცვლება"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "სანიშნეთა იმპორტის ოსტატი"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "ნაბიჯი 1:<b>იმპორტის მოდულის ამორჩევა</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "გამოსახულება"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"სიიდან გთხოვთ ამოირჩიოთ შესაფერისი იმპორტის მოდული. ყოველ მოდულს სხვადასხვა "
+"ფორმატიდან იმპორტი შეუძლია."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "ხელმისაწვდომი იმპორტის მოდულები:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "ნაბიჯი 2: <b>აირჩიეთ დასაიმპორტებელი სანიშნეთა ფაილი</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"გთხოვთ აირჩიოთ სანიშნეთა ფილი, საიდანაც გსურთ იმპორტირება. ნაგულისხმევი გეზი "
+"იმპორტის მოდულმა უკვე ამოიცნო."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>სანიშნეთა გეზი:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "ნაბიჯი 3:<b>მიმდინარეობს სანიშნეთა იმპორტი...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "გთხოვთ მოითმინოთ, სანამ სანიშნეთა იმპორტი განხორციელდება."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>იმპორტის პროგრესი:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&იერსახე"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "შრიფტი და ფერები"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "შრიფტი:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "კლიენტის ბრძანების ფერი:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "სერვერის პასუხის ფერი:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "მრავალხაზიანი პასუხის ფერი:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "შეცდომის შეტყობინების ფერი:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "სტატუსის შეტყობინების ფერი:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&გამონატანი"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&ფაილის გამონატანი"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "ჟურნალის ფაილში შ&ენახვა"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "გამონატანის ფაილი:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "საწყისი სერვერის ინფორმაცია"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "დაშორებული სერვერის ინფორმაცია"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>წყარო:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>დანიშნულების ადგილი:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "გადაცემის ტიპი:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "კა&ვშირი"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "აქტიური კავშირი IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "PORT/EPRT-ის ძალდატანება, რათა გამართული IP გამოიყენონ"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/ჰოსტის სახელი:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "აქტიური კავშირის პორტთა თანრიგი"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "პორტების &მხოლოდ მითითებული პორტთა თანრიგიდან გამოყენება"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "მინიმალური პორტი:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "მაქსიმალური პორტი:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "დაყოვნების დრო"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "კავშირის დაყოვნების დროის მართვა (წამებში):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "მონაცემთა გადაცემის დაყოვნების დრო (წამებში):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "სიჩქარის შეზღუდვა"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "ჩამოტვირთვა (კბ/წმ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "ატვირთვა (კბ/წმ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "დისკზე თ&ავისუფალი ადგილი"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "დისკზე თავისუფალი ადგილის შემოწმება"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "თი არ &არის საკმარისი თავისუფალი სივრცე, გადაცემის შეჩერება"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "ინტერვალი (წმ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "მინიმალური თავისუფალი სივრცე (მბ):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "ძა&ფები"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "სესიისას ძაფების რაოდენობა:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "არ შემდგარი გადაცემები არაა."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "სხვა"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"\"გადათრევა ჩაგდების\" შემდეგ, გადაწერის მაგივრად, ფაილთა რიგში ჩაყენება"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "ცარიელი დირე&ქტორიების გაცდენა"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "კავშირის გაწყვეტამ&დე დამოწმება"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "მასპინძელი სერვერის სახელი:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "ოქმი:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP TLS/SSL-ზე (ექსპლიციტური)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP TLS/SSL-ზე (იმპლიციტური)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP SSH2-ზე"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "გვერდის სათაური:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "დაშორებული დირექტორია:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "ლოკალური დირექტორია:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&ანონიმური შესვლა"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&გაფართოვებული"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "გაფართოებული პასიური რეჟიმის გამოყენების &გამორთვა"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "პასიური რეჟიმის გამოყენების გამორთვა"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "STAT-ის გამოყენება დირექტორიათა სიისთვის"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "რამდენიმე ძაფის გადაცემა"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "ამ გვერდისთვის რამოდენიმე ძაფს ნუ გამოიყენებთ"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "სერვერის კოდირება"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "კოდირება:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "ჩავარდნისას დაკავშირების თა&ვიდან ცდა"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "თავიდან ცდა"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "თავიდან ცდების რაოდენობა (0 = უსასრულო):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "თავიდან ცდის ინტერვალი:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII გა&ფართოებები"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "გაფართოების დამატება"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "გაფართოება:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "გაფართოება"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "დაკავშირების თავიდან ცდა..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "დაკავშირების თავიდან ცდა..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "უჯრაში სრული მისამართი ჩაწერეთ"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "ftp ჰოსტის სახელი ჩაწერეთ"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "ანონ&იმური შესვლა"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "ანონიმური შესვლის შემოწმება"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "ანგარიშის მომხმარებლის სახელი ჩაწერეთ"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "ანგარიშის პაროლი ჩაწერეთ"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "სანიშნედ &დამატება"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "დეტალური"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "კავშირი დამყარებულია."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "STAT-ის გამოყენება დირექტორიათა სიისთვის"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 სერტიფიკატი"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "დაკავშირებისას შემდეგი SSL სერტიფიკატის გამოყენება"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "გეზი:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "ელფოსტის &მისამართი"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "ენფოსტის მისამართის მართვის ცენტრიდან &გამოყენება"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "ელფოსტა:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "დასაწყისი და გამოსვლა"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+"აქტიური გადაცემების არსებობის შემთხვევაში, პროგრამიდან &გამოსვლის დადასტურება"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "პროგრამის სისტემურ პანელში ჩა&კეცილად გაშვება"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "გაშვებისას მისალმების &ეკრანის ჩვენება"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "სისტემური პანელის &ხატულის ჩვენება"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "გვერდის საწყისი პარამეტრები"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "სანიშნეთა ფაილის &დაშიფვრა"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "სანიშნეთა გარდა გვერდების ზარდახშიდან ჩ&ვენება"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "შ&ეტყობინება"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "ბუშტები"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "გადაცემის დასრულებისას ბუშტის ჩ&ვენება"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "მხოლოდ მასინ ჩვენება როდესაც რიგი გადაცემის შემდეგ &ცარიელია"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "როდესაც კავსირი წარმატებით &დამყარდება, ბუშტის ჩვენება"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>ფაილი:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "არა"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "ფაილთა სია"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "დაუმუშავებელი"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "ვერ მოიძებნა"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "ვერ განხორციელდა"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "მთავარი ფანჯრის ზომა."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "მთავარი ფანჯრის მდებარეობა ეკრანზე."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "ახალი გვერდისთვის თავიდან ცდების ნაგულისხმევი რაოდენობა."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "ახალი გვერდისთვის დაყოვნების დროის ნაგულისხმევი რაოდენობა."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "ბუშტი უნდა გამოჩნდეს, როდესაც რაიმე მოქმედება დასრულდება."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "ბუშტი უნდა გამოჩნდეს, როდესაც ყველა გადაცემა დასრულდება."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"ბუშტი უნდა გამოჩნდეს როდესაც ცდების შემდეგ სერვერთან კავშირი დამყარდება."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "მომხმარებელმა უნდა დაადასტუროს გასვლა, თუ გადაცემები გაშვებულია."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "სანიშნეთა ფაილის დაშიფვრვის მდგომარეობა."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "ნაგულისხმები ლოკალური დირექტორია."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "პროგრამა უნდა გაეშვას ჩაკეცილი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "პროგრამა უნდა გაეშვას ჩაკეცილი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "პროგრამის გაშვებისას მისალმების ეკრანი უნდა აისახოდ."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "სისტემური ხატულა უნდა აისახოს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "ზარდახშიდან გვერდები სანიშნეთა შორის უნდა იყოს ნაჩვენები."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"კავშირის ყოველ გაწყვეტაზე უნდა აისახოს \"კავსირის გაწყვეტის დადასტურების\" "
+"დიალოგი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "გვერდის ნაგულისხმევი კოდირება."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr "შაბლონთა სია, სადაც ASCII რეჟიმი უნდა გამოიყენებოდეს გადაცემისთვის."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "ცარიელი დირექტორიები უნდა გამოიტოვოს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "შრიფტი, რომელიც ჟურნალის ელემენტისთვის უნდა გამოიყენებოდეს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "სერვერზე გაგზავნილი ბრძანებების ფერი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "სერვერის პასუხების ფერი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "სერვერიდან მრავალხაზიანი პასუხის ფერი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "შეცდომის შეტყობინების ფერი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "მდგომარეობის შეტყობინების ფერი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "ჟურნალი ასევე ფაილში უნდა ჩაიწერებოდეს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "ფაილი, რომელშიც ჟურნალი უნდა ჩაიწეროს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"მითითებულ პორტთა თანრიგიდან უნდა იქნას აქტიური გადაცემის პორტი არჩეული."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "პორტთა თანრიგის დასაწყისი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "პორტთა თანრიგის დასასრული."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "IP აქტიური გადაცემებისას გადაწერილი უნდა იყოს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "PORT ბრძანების უგულველსაყოფად გაგზავნილი IP."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr "გადათრევა ჩაგდებისას, გადაცემის დაწყების ნაცვლად მათი რიგში ჩაყენება."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"kftpgrabber-მა უნდა შეამოწმოს დისკზე ადგილი და შეწყვიტონ გადაცემა, როდესაც "
+"თავისუფალი ადგილი საკმარისი აღარ არის."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "დისკის შემოწმების ინტერვალი."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "დისკის მინიმალური თავისუფალი სივრცე (მბ) რაც ხელმისაწვდომი უნდა იყოს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "ანონიმური პაროლებისთვის KDEს გლობაური ელფოსტის გამოყენება."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+"ელფოსტის მისამართი, რომელიც ანონიმური პაროლებისთვის უნდა იყოს გამოყენებული."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "გადაცემისას ძაფების რაოდენობა."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "მომხმარებელმა უნდა დაადასტუროს გასვლა, თუ გადაცემები გაშვებულია."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "კავშირის დახურვისას დაყოვნების დრო (წამებში)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "მონაცემთა გადაცემისას დაყოვნების დრო (წამებში)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "ზოგადი ჩამოქაჩვის სიჩქარის შეზღუდვა (კბ/წმ)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "ზოგადი ატვირთვის სიჩქარის შეზღუდვა (კბ/წმ)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "საწყისი პარამეტრებით დირექტორიათა ხე ნაჩვენები უნდა იყოს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "მიმოხილვისას დამალული ფაილები უნდა გამოჩნდეს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"ფაილთა ზომები \"ადამიანებისთვის წაკითხვადად\" უნდა გამოჩდეს თუ ბაიტებში."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "ყოველი ფაილის პატრონი და ჯგუფი უნდა გამოჩდეს."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "&დირექტორიათა ხის ჩვენება"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "ფილტრის ჩვე&ნება"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "ძირითადი მენიუ"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "სანიშნეთა პანელი"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "'%1'-სთვის მომხმარებლის სახელი არაა მითითებული."
+
+#~ msgid "Error Connecting"
+#~ msgstr "დაკავშირების შეცდომა"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "ჩვენება"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+S"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "სწრაფად დაკავშირება"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "ამ ფაილის გასახსნელად ნებისმიერი მოსარგები პროგრამის პოვნა შეუძლებელია!"
+
+#~ msgid "Webpage design"
+#~ msgstr "ვებგვერდის დიზაინი"
+
+#~ msgid "Command"
+#~ msgstr "ბრძანება"
+
+#~ msgid "What's this?"
+#~ msgstr "ეს რა არის?"
+
+#~ msgid "Server Management"
+#~ msgstr "სერვერის მართვა"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "ჩამოტვირთვა: %1 მბ ატვირთვა: %2 მბ<br>კრედიტები: %3 მბ პროპორცია: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "გვერდის ბრძანების დიალოგი"
+
+#~ msgid "Username"
+#~ msgstr "მომხმარებლის სახელი"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "შეიყვანეთ მომხმარებლის სახელი ან დააწყაპუნეთ გაუქმებას"
+
+#~ msgid "Group name"
+#~ msgstr "ჯგუფის სახელი"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "შეიყვანეთ ჯგუფის სახელი ან დააწყაპუნეთ გაუქმებას"
+
+#~ msgid "Description name"
+#~ msgstr "აღწერის სახელი"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "შეიყვანეთ აღწერა ან დააწყაპუნეთ გაუქმებას"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "პაროლები არ ემთხვევა"
+
+#~ msgid "Optional"
+#~ msgstr "არასავალდებულო"
+
+#~ msgid "Password retype:"
+#~ msgstr "პაროლის თავიდან ჩაწერა:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "ნე&დლი ბრძანების გაგზავნა...ჩვენება "
+
+#~ msgid "Display your idle time"
+#~ msgstr "უქმი დროის ჩვენება"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "თქვენი უქმი დრო განსაზღვრეთ (მხოლოდ სესიისთვის)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "თქვენი უქმი დრო განსაზღვრეთ (მხოლოდ სესიისთვის).<br>ეს განსაზღვრავს თქვენს უქმ დროს (დროის როდენობა, როდესაც ხაზზე ხართ უქმად<br>). მაქს. უქმი დრო არის 7200 წმ.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "ეს თქვენს პაროლს შეცვლის"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "ეს თქვენს პაროლს შეცვლის.<br>პაროლები მხოლოს 8 სიმბოლოსგან უნდა შედგებოდეს."
+
+#~ msgid "Display the group info"
+#~ msgstr "ჯგუფის შესახებ ინფორმაციის ჩვენება"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "ჯგუფის შესახებ ინფორმაციის ჩვენება<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "მიმდინარე ფსევდონიმების ჩვენება"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "მიმდინარე cdpaths ჩვენება"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "მიმდინარე glftpd ვერსიის ჩვენება"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "მიმდინარე glftpd ვერსიის ჩვენება<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "ხაზზე მყოფი მომხმარებლების ჩვენება"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "ხაზზე მყოფი მომხმარებლების ჩვენება<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "მისალმების ეკრანის ჩვენება"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "მისალმების ეკრანის ჩვენება<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "გვერდზე მიმდინარე დროის ჩვენება"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "გვერდზე მიმდინარე დროის ჩვენება<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "მომხმარებლის წაშლა, შეიძლება თავიდან წაკითხული იყოს გვერდის READD-ით"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "მომხმარებლის წაშლა, შეიძლება თავიდან წაკითხული იყოს გვერდის READD-ით<br><br><i>მაგალითად:</i>გვერდზე deluser Archimede<br><br>ეს გააქტიურებს მომხმარებელ 'Archimede' ნიშანს DELETED (6).<br>მომხმარებლის სრულად წასაშლელად გვერდი უნდა 'გაწმინდოთ'<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "მომხმარებლის პაროლის შეცვლა"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "მომხმარებლის პაროლის შეცვლა<br><i>მაგალითად:</i>გვერდზე chpass Archimede ახალი პაროლი<br>ეს მომხმარებელ 'Archimede'-სთვის შეცვლის <br>[პაროლს.<br><br>იხილეთ \"გვერდის passwd\" მეტი ცნობებისთვის, თუ მიიღეთ პაროლი არაა უსაფრთხოს<br>შეცდომა.<br><br>* ნიშნავს ყველა პაროლს, <i>მაგალითად:</i> გვერდზე chpass arch *<br>ეს arch-ს საშუალებას მიცდემს ნებისმიერი პაროლით შევიდეს<br><br>@ ნიშნავს ყველა ელფოსტის მაგვარ პაროლს, <i>მაგალითად:</i> გვერდზე chpass arch @<br>ეს arch-ს საშუალებას მიცდემს შემოვიდეს a@b.com-თი მაგრამ არა ab.com-ით<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "მომხმარებლის ნიშნების ჩვენება"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "მომხმარებლის ნიშნების ჩვენება<br><br><i>მაგალითად:</i> გვერდის ნიშნები<br><br>ეს თქვენს ნიშნებს ასახავს.<br><br><i>მაგალითად:</i> გვერდის ნიშნები Archimede<br><br>ეს Archimedeს ნიშნებს აჩვენებს.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "მომხმარებლის გვერდიდან გაპანღურება"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "მომხმარებლის გვერდიდან გაპანღურება<br><br><i>მაგალითად:</i> site kick Archimede<br><br>ეს 'Archimede'-სდ ყველა კავშირს მოკლავს<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "წაშლილი მომხმარებლების წაშლა, გვერდის READD ამოსლილი მომხმარებლებისთვის არ იმუშავებს."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "წაშლილი მომხმარებლების წაშლა, გვერდის READD ამოსლილი მომხმარებლებისთვის არ იმუშავებს.<br><br><i>მაგალითად:</i> site purge<br>ეს წაშლის ყველა მომხმარებელს, ვისაც DELETED ნიშანი აქვს.<br><br><i>მაგალითად:</i> site purge frank<br> ეს მხოლოდ frank-ს წაშლის და დანარჩენ წაშლილ მომხმარებლებსწ დატოვებს გვერდზე<br><br>თუ ჯგუფის ადმინისტრატორი ხართ, მაშინ მხოლოდ საკუთარი ჯგუფიდან შეძლებთ მომხმარებელთა წაშლას (ეს თუ<br>კონფიგუაციის ფაილზე ამ ბრძანების წვდომა გაქვთ).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "მომხმარებლის თავიდან დამატება"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "მომხმარებელთა ატვირთვა/ჩამოტვირთვის სტატუსის ჩვენება"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "მომხმარებელთა ატვირთვა/ჩამოტვირთვის სტატუსის ჩვენება<br><br>განისაზღვრება '/ftp-data/text/user.stats'-ში<br><br>თუ რამოდენიმე სექცია გაქვთ, მაშინ ეს<br>ყველას სტატისტიკას ასახავს. (მაგრამ ამ ფაილის ასლი უნდა გააკეთოთ SECTIONuser.stats.-ში<br>მაგ: თუ გაქვთ სექცია სახელად თამაშები, მაშინ glftpd მოძებნის<br>user.stats და GAMESuser.stats ფაილებს /ftp-data/text dir.-ში.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "აჩვენებს ხელმისაწვდომ ჯგუფებს"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "აჩვენებს ჯგუფის შესახებ დეტალურ ცნობებს"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "აჩვენებს ჯგუფის შესახებ დეტალურ ცნობებს<br><br><i>მაგალითად:</i> site ginfo ftp<br><br>ეს ჯგუფ 'ftp'-ზე დეტალურ ცნობებს ცჩვენებს.<br>თუ მომხმარებელი წაშლილია, მათი ჭდის ხაზებზე იქნება \"***DELETED***\".<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "ახალი ჯგუფის დამატება"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "ახალი ჯგუფის დამატება<br><br><i>მაგალითად:</i> site grpadd group new_group<br><br>ეს დაამატებს ჯგუფს 'group' აღწერით 'new_group'.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "ჯგუფის წაშლა"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "ჯგუფის წაშლა<br><br><i>მაგალითად:</i> site grpdel group<br><br>ეს წაშლის ჯგუფს 'group'.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "ჯგუფის აღწერის შეცვლა"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "ჯგუფის აღწერის შეცვლა<br><br><i>მაგალითად:</i> site grpnfo ftp new_description<br><br>ეს შეცვლის ჯგუფ 'ftp'-ს მიმდინარე აღწერას<br>'new_description'-ით.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "თქვენი მიმდინარე მდგომარეობის ზოლის ასახვა"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "ყველა დროის ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "ყველა დროის ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი ყველა დროის ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "ყველა დროის ჩამოქაჩვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "ყველა დროის აქაჩვების ასახვა"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი ყველა დროის აქაჩვების ასახვა"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "ყველა დროის აქაჩვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "დღის ტოპ ატვირთვების ასახვა"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი დღის ტოპ ატვირთვების ასახვა"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "დღის ტოპ ატვირთვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display daytop download"
+#~ msgstr "დღის ტოპ ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი დღის ტოპ ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "დღის ტოპ ჩამოქაჩვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "თვის ტოპ ატვირთვების ასახვა"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი თვის ტოპ ატვირთვების ასახვა"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "თვის ტოპ ატვირთვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "თვის ტოპ ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი თვის ტოპ ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "თვის ტოპ ჩამოქაჩვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "კვირის ტოპ აქაჩვების ასახვა"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი კვირის ტოპ აქაჩვების ასახვა"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "კვირის ტოპ აქაჩვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "კვირის ტოპ ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "ჯგუფის კუთვნილი კვირის ტოპ ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "კვირის ტოპ ჩამოქაჩვების ასახვა.<br><group> ესეც არაა სავალდებულო. ამის განსაზღვრა აჩვენებს მარტო იმ მომხმარებლებს, ვინც<br>ამ ჯგუფს ეკუთვნის, მაგრამ მას აქვს სპეციალური წვდომა <br>glftpd.conf-თან ამის გასაკეთებლად. ამას -grpstats პარამეტრი<br>აკონტროლებს."
+
+#~ msgid "Display server traffic"
+#~ msgstr "სერვერის ტრაფიკის ასახვა"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "სერვერის ტრაფიკის ასახვა<br>ყველა სექციაში ყველა მომხმარებლის ყველა ატვირთვა/ჩამოქაჩვის ჩვენება"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "ყველა დროის ჯგუფის აქაჩვების ასახვა"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "ყველა დროის ჯგუფის აქაჩვების ასახვა<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "თვის ჯგუფის აქაჩვების ასახვა"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "თვის ჯგუფის აქაჩვების ასახვა<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "თვის ჯგუფის ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "თვის ჯგუფის აქაჩვების ასახვა<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "კვირის ჯგუფის აქაჩვების ასახვა"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "კვირის ჯგუფის ჩამოქაჩვების ასახვა<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "კვირის ჯგუფის ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "კვირის ჯგუფის ჩამოქაჩვების ასახვა<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "ყველა დროის ჯგუფის ჩამოქაჩვების ასახვა"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "ყველა დროის ჯგუფის ჩამოქაჩვების ასახვა<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "დახმარების ეკრანის ჩვენება"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "დახმარების ეკრანის ჩვენება<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "არშემგდარი შესვლების ჩვენება"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "არშემგდარი შესვლების ჩვენება<br><br>ეს ასახავს '/glftpd/ftp-data/logs/login.log'<br>იხილეთ ინფო \"გვერდის სისტემურ ჟურნალზე\" სინტაქსისისთვის.<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "შემოწმება თუ როდის იყო მომხმარებელი ხაზზე ბოლოჯერ"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "შემოწმება თუ როდის იყო მომხმარებელი ხაზზე ბოლოჯერ<br><br><i>მაგალითად:</i> გვერდმა ნახა არქიმედე<br><br>ეს ასახავს თუ როდის იყო არქიმედე ბოლოჯერ შემოსული.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "მომხმარებლის ფაილს ნედლ ფორმატში ასახავს"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "მომხმარებლის ფაილს ნედლ ფორმატში ასახავს<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "ხაზზე მყოფი მომხმარებლების შესახებ დეტალურ ცნობებს აჩვენებს"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "ხაზზე მყოფი მომხმარებლების შესახებ დეტალურ ცნობებს აჩვენებს<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "სანიშ&ნეების გაგზავნა"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>თქვენ აპირებთ KFTPGrabber-ის სანიშნეების გაგზანას <b>%1</b>სთვის. ისინი შეიძვაბე შეიცავდეს პაროლებს, ან მგძნობიარე X509 სერტიფიკატებს: ამ სანიშნეების გაგზავნა არა უსაფრთხო.<br><br>დარწმუნებული ხართ?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "სანიშნეების გაგზავნა"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "ეს სერვერი დისტრიბუცირებული FTP დემონია"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "დარწმუნებული ხართ, რომ გსურთ ამ ფაილ(ებ)ის წაშლა?"
+
+#~ msgid "Date"
+#~ msgstr "თარიღი"
+
+#~ msgid "Permissions"
+#~ msgstr "უფლებები"
+
+#~ msgid "Owner"
+#~ msgstr "მფლობელი"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "'%1' დირექტორიის გახსნა შეუძლებელია."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr "ეს დირექტორია შეიცავს %n ფაილს."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "ყველაფრის ასახვას დრო უნდა."
+
+#~ msgid "Are you sure?"
+#~ msgstr "დარწმუნებული ხართ?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "გადაცემა..."
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+S"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "საერთო"
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+S"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "ახალი შაბლონის დამატება"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "დარწმუნებული ხართ რომ გსურთ ამ შაბლონის წაშლა?"
+
+#~ msgid "&Other"
+#~ msgstr "&სხვა"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "ჩამოქაჩვის შ&ემდეგ ფაილთა სახელების ქვედა რეგისტრში გადაყვანა"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "მარ&კირება"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "შაბლონის &დამატება..."
+
+#~ msgid "E&dit..."
+#~ msgstr "რ&ედაქტირება..."
+
+#~ msgid "Re&move"
+#~ msgstr "წაშ&ლა"
+
+#~ msgid "E&nabled"
+#~ msgstr "ჩა&რთული"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "პრიორიტე&ტთა სია"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "პრიორიტეტის შაბლონი:"
+
+#~ msgid "Patterns"
+#~ msgstr "შაბლონები"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "შაბლონის &დამატება"
+
+#~ msgid "&Low"
+#~ msgstr "&დაბალი"
+
+#~ msgid "Value:"
+#~ msgstr "მნიშვნელობა:"
+
+#~ msgid "&Skip"
+#~ msgstr "&გაცდენა"
+
+#~ msgid "&High"
+#~ msgstr "&მაღალი"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "პრიორიტეტის სიის პარამეტრები"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "პრიორიტეტტა სიის ჩა&რთვა"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "ცარიელი &ფაილების გაცდენა"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "დირექტორიებისთვის პრიორიტეტთა სიის გ&ააქტიურება"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "გასაცდენ სიაში არსებული ფაილების &რიგში არ ჩაყენება"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "რიგში ჯერ დირექტორიების და შემდეგ ფაილების ჩაყენება"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "მიმოხილვისას მარკირებული შაბლონების სია."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "ფაილები ფაილთა სიაში უნდა იყვოს მრკირებული."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "ფაილები გაცდენის სიაში გამოტოვებულ უნდა იქნას."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "ცარიელი ფაილები უნდა გამოიტოვოს."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "გაცდენის სია დირექტორიებზეც აქტიურდება."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "გაცდენის სიის ფაილები რიგში არ უნდა ჩადგნენ."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "რიგში დირექტორიების ფაილებზე წინ დაყენება."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "ყველა ჩამოქაჩული ფაილის სახელი ქვედა რეგისტრში უნდა იყოს."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "editshred"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "ფილტრის &დაყენება..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "ფილტრის გაწმენდა"
+
+#~ msgid "Filter"
+#~ msgstr "ფილტრი"
+
+#~ msgid "Enter filter:"
+#~ msgstr "შეიყვანეთ ფილტრი:"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "FTP სანიშნეთა რედაქტორი"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL პარამეტრები"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "გადაცემის რეჟიმი:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - პირადი (ინტეგრირებული და პირადი)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - კონფიდენციალური (პრივატულობა ინტეგრაციის გარეშე)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - დაცული (ინტეგრაცია პრივატულობის გარეშე)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - სუფთა (SSL-ს გარეშე)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "კავშირი ვერ შედგა (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "გადაცემა:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "ქვემოთ: %1/წ ზემოთ: %1/წ"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "SFTP დირექტორიის სიის წაკითხვა..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "SFTP დირექტორია შეიცვალა '%1'-ით"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "'%1'-ით დაწყებული ფაილი იქაჩება"
+
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr "გადაცემულია %n ბაიტი."
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "'%1'-ით დაწყებული ფაილის ატვირთვა"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "FXP გადაცემა ვერ შედგა."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "დაცვის რეჟიმის გამართვა ვერ შედგა, "
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "უცნობი ჰოსტი '%1'."
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "იმპლიციტური SSL კავშირის დამყარება შეუძლებელია."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "იმპლიციტური SSL კავშირი დამყარდა."
+
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "პასიური რეჟიმი ორჯერ ვერ შედგა, PASV-ს გამოყენების გამორთვა!"
+
+#~ msgid "Directory listing complete."
+#~ msgstr "დირექტორიის სია დასრულდა."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "სერვერთან დაკავშირება შეუძლებელია."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "სერვერთან კავშირი გაწყვეტილია."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "საწყის და საბოლოო სერვერებზე SSL-ის შეუთავსებელი ვერსიებია."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "მონაცემთა გადაცემის უზრუნველყოფის პრობლემა."
+
+#~ msgid "Error reading file."
+#~ msgstr "ფაილის წაკითხვის შეცდომა."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "სერვერთან დაკავშირება შეუძლებელია"
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "დირექტორია არაა ქეშში."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "დირექტორიის გახსნა შეუძლებელია."
+
+#~ msgid "View &Local"
+#~ msgstr "ლოკალურად &ხილვა"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "&ხაზიდან გასვლის რეჟიმი"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "URL არ არის ქეშში."
+
+#~ msgid "Cache"
+#~ msgstr "ქეში"
+
+#~ msgid "Cache support"
+#~ msgstr "ქეშის მხარდაჭერა"
+
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "დი&რექტორიათა სიის ქეშის ჩართვა"
+
+#~ msgid "Alt+D"
+#~ msgstr "Alt+D"
+
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr "ქეშის ვადის გასვლის დრო (წამებში):"
+
+#~ msgid "Should the cache be used when browsing the sites."
+#~ msgstr "ქეში უნდა გამოიყენებოდეს გვერდების მიმოხილვისას."
+
+#~ msgid "The time after cached entries expire."
+#~ 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/kftpgrabber.po b/translations/lt/messages/kftpgrabber.po
new file mode 100644
index 0000000..9070ee8
--- /dev/null
+++ b/translations/lt/messages/kftpgrabber.po
@@ -0,0 +1,3016 @@
+# translation of kftpgrabber.po to Lithuanian
+# Lithuanian translation of the packate
+# Automatically generated, 2005.
+# Donatas Glodenis <dgvirtual@akl.lt>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2005-09-10 19:40+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.10.2\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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "Veiksmai"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Aplankas"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Prioritetas"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Išsiųsti"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr ""
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Bylos vardas"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Dydis"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "Prioritetas"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Paskiries vieta"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+#, fuzzy
+msgid "File Exists"
+msgstr "Byla jau yra"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr ""
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr ""
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr ""
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Programuotojas"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr ""
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr ""
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr ""
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr ""
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Aplankas"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr ""
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr ""
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Leidimai"
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr ""
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "Jungiuosi..."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+#, fuzzy
+msgid "Connecting..."
+msgstr "Jungiuosi..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Jungiuosi..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Atšaukti"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Perkelti"
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Pervadinti"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Prisiju&ngimas"
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Perkelti"
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "&Atjungti"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Prisiju&ngimas"
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr ""
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr ""
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Pervadinti"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Jungiuosi..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Jungiuosi..."
+
+#: src/engine/connectionretry.cpp:93
+#, fuzzy
+msgid "Retry aborted."
+msgstr "&Atšaukti"
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Praleisti"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Perrašyti"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Tęsti"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Pervadinti"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Klausti"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr ""
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr ""
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+#, fuzzy
+msgid "Log"
+msgstr "Žurnalas"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr ""
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sesija"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr ""
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr ""
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr ""
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr ""
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr ""
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr ""
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr ""
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Dvejetainė"
+
+#: src/mainactions.cpp:100
+#, fuzzy
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr ""
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:54
+#, fuzzy
+msgid "Select..."
+msgstr "Pasirinkti..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:59
+#, fuzzy
+msgid "Transfer"
+msgstr "Perkelti"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, fuzzy, no-c-format
+msgid "Description"
+msgstr "Aprašymas"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+#, fuzzy
+msgid "R&emove"
+msgstr "&Pašalinti"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Forma1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Spalva:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr ""
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Šablonas"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Spalva"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+#, fuzzy
+msgid "Enabled"
+msgstr "Įjungtas"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Paryškinimas"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:69
+#, fuzzy
+msgid "General"
+msgstr "Bendra"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:72
+#, fuzzy
+msgid "Display"
+msgstr "Rodyti"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Veiksmai"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtrai"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Kontrolinė suma"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr ""
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Bylos vardas"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filtrai"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Parsisiųsti"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Pervadinti"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "&Naujas..."
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Pervadinti"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Prisiju&ngimas"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr ""
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr ""
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtras: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, fuzzy, no-c-format
+msgid "Name"
+msgstr "Vardas"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Šaltinis"
+
+#: src/widgets/queueview/queueview.cpp:438
+#, fuzzy
+msgid "Destination"
+msgstr "Paskiries vieta"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Eiga"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+#, fuzzy
+msgid "Speed"
+msgstr "Greitis"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Parsisiųsti"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:561
+#, fuzzy
+msgid "Move &Up"
+msgstr "A&ukštyn"
+
+#: src/widgets/queueview/queueview.cpp:562
+#, fuzzy
+msgid "Move &Down"
+msgstr "Že&myn"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "A&ukštyn"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pauzė"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr ""
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+#, fuzzy
+msgid "Status"
+msgstr "Būsena"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:112
+#, fuzzy
+msgid "&New..."
+msgstr "&Naujas..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+#, fuzzy
+msgid "&Rename"
+msgstr "Pe&rvadinti"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Dydis:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Naujas serveris"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr ""
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+#, fuzzy
+msgid "&Edit..."
+msgstr "&Keisti..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Eksportuoti..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr ""
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+#, fuzzy
+msgid "&Abort"
+msgstr "&Atšaukti"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:110
+#, fuzzy
+msgid "&Properties"
+msgstr "&Savybės"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Filtrai"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Siuntimas"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Sukurti aplanką"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:164
+#, fuzzy
+msgid "&Disconnect"
+msgstr "&Atjungti"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Pašalinti bylą"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Praleisti"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Prioritetas"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Sukurti aplanką"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Komanda:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, fuzzy, no-c-format
+msgid "&General"
+msgstr "&Bendros"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:98
+#, fuzzy
+msgid "Unknown"
+msgstr "Nežinoma"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tipas:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+#, fuzzy
+msgid "Location:"
+msgstr "Vieta:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Dydis:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Sukurta:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Leidimai"
+
+#: src/widgets/browser/propsplugin.cpp:240
+#, fuzzy
+msgid "Access Permissions"
+msgstr "Priėjimo leidimai"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klasė"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Rodyti\n"
+"įrašus"
+
+#: src/widgets/browser/propsplugin.cpp:253
+#, fuzzy
+msgid "Read"
+msgstr "Skaityti"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Įrašyti\n"
+"įrašus"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Įrašyti"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Įeikite"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Vykdyti"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Specialus"
+
+#: src/widgets/browser/propsplugin.cpp:275
+#, fuzzy
+msgid "User"
+msgstr "Naudotojas"
+
+#: src/widgets/browser/propsplugin.cpp:278
+#, fuzzy
+msgid "Group"
+msgstr "Grupė"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Kiti"
+
+#: src/widgets/browser/propsplugin.cpp:284
+#, fuzzy
+msgid "Set UID"
+msgstr "Nustatyti UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+#, fuzzy
+msgid "Set GID"
+msgstr "Nustatyti GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+#, fuzzy
+msgid "Sticky"
+msgstr "Pritvirtintas"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr ""
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr ""
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Filtrai"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Sukurti aplanką"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Filtrai"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr ""
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr ""
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Nukelti į sistemos dėklą"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr ""
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr ""
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr ""
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Eilė"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr ""
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr ""
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Rody&ti"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Tikslas:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Šaltinis:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Serverio vardas:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Mazgas:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Slaptažodis:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "Naudotojo vardas:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Prievadas:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, fuzzy, no-c-format
+msgid "Replace With"
+msgstr "Keisti į"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, fuzzy, no-c-format
+msgid "Image"
+msgstr "Paveiksliukas"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, fuzzy, no-c-format
+msgid "&Appearance"
+msgstr "&Išvaizda"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, fuzzy, no-c-format
+msgid "Font:"
+msgstr "Šriftas:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "Output file:"
+msgstr "Išvesties byla:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, fuzzy, no-c-format
+msgid "Co&nnection"
+msgstr "Prisiju&ngimas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, fuzzy, no-c-format
+msgid "Other"
+msgstr "Kita"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Mazgo vardas:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, fuzzy, no-c-format
+msgid "Protocol:"
+msgstr "Protokolas : "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, fuzzy, no-c-format
+msgid "&Advanced"
+msgstr "&Sudėtingesni"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Koduotė:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Mėginti vėl"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, fuzzy, no-c-format
+msgid "Extension:"
+msgstr "Priesaga:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Plėtinys"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Jungiuosi..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Jungiuosi..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, fuzzy, no-c-format
+msgid "Advanced"
+msgstr "Papildomai"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Kelias:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, fuzzy, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Rodyti lygiai"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, fuzzy, no-c-format
+msgid "none"
+msgstr "nėra"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Gerai"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Nerasta"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Žymelių įrankių juosta"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Rodyti"
+
+#~ msgid "Command"
+#~ msgstr "Komanda"
+
+#~ msgid "What's this?"
+#~ msgstr "Kas tai yra?"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Slaptažodžiai neatitinka"
+
+#~ msgid "Optional"
+#~ msgstr "Nebūtina"
+
+#~ msgid "Date"
+#~ msgstr "Data"
+
+#, fuzzy
+#~ msgid "Permissions"
+#~ msgstr "Leidimai"
+
+#~ msgid "Owner"
+#~ msgstr "Savininkas"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Perkelti"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Bendra"
+
+#, fuzzy
+#~ msgid "&Other"
+#~ msgstr "&Kita"
+
+#~ msgid "Re&move"
+#~ msgstr "Pa&šalinti"
+
+#~ msgid "Patterns"
+#~ msgstr "Šablonai"
+
+#, fuzzy
+#~ msgid "Value:"
+#~ msgstr "Reikšmė:"
+
+#~ msgid "&Skip"
+#~ msgstr "Pra&leisti"
+
+#~ msgid "Filter"
+#~ msgstr "Filtras"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Darbas neprisij&ungus"
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/kftpgrabber.po b/translations/nl/messages/kftpgrabber.po
new file mode 100644
index 0000000..b4013e0
--- /dev/null
+++ b/translations/nl/messages/kftpgrabber.po
@@ -0,0 +1,2991 @@
+# translation of kftpgrabber.po to Dutch
+#
+# Rinse de Vries <rinsedevries@kde.nl>, 2005, 2006.
+# Maarten Rütten <maartenrutten@kde.nl>, 2005, 2006.
+# Bram Schoenmakers <bramschoenmakers@kde.nl>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-12-11 19:57+0100\n"
+"Last-Translator: Rinse de Vries <rinsedevries@kde.nl>\n"
+"Language-Team: Dutch <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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "bevat"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "bevat niet"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "gelijk aan"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "is ongelijk aan"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "overeenkomend met regexp"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "niet overeenkomend met regexp"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "is"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "is niet"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Directory"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "is groter dan"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "is kleiner dan"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "bytes"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Selecteer een handeling."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Prioriteit:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Downloaden"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Uploaden"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Onbekende tag tijdens het ontleden van aangepaste site-commando's!"
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Verzochte operatie is mislukt! Respons van de server is: "
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Handler genaamd <b>%1</b> is niet gevonden voor het ontleden van de "
+"respons!</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Bestandsnaam"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Itemtype"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Grootte"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Prioriteit wijzigen"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Overslaan bij wachtrij"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Inkleuren in lijstweergave"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Verbergen in lijstweergave"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Bestemming in kleine letters"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Naamloze regel"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP-import"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber-import"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp-import"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla 3-import"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Alle overdrachten in de wachtrij zijn voltooid."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Bestand bestaat reeds"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - een FTP-client voor KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Een optioneel URL-adres om mee te verbinden"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Hoofdontwikkelaar"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Ontwikkelaar"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH-code"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc-code"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon-popup-code"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Verkeersgrafiekwidget"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Pictogramontwerpen"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Tests en debuggen"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Directoryontledercode"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Code voor afhandelen van lijstweergavekolom"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Overdracht van de volgende bestanden is voltooid:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Verbinding met 'de server' is mislukt."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Aanmelden bij de server is mislukt"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Bronbestand werd niet gevonden."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Toegang was geweigerd"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Bestand kon niet geopend worden."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Overdracht is vanwege onbekende reden mislukt."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Overdracht van de volgende bestanden <b>is afgebroken</b> "
+"omdat er niet genoeg ruimte vrij is op '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Kon SSH-verbinding (%1) niet opzetten"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Bezig met aanmelden..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Verbonden met de server, bezig met aanmelden..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Aanmelden is mislukt."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Toetsenbordinteractieve authenticatie is geslaagd."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Authenticatie met publieke sleutel is geslaagd."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Kon SFTP-kanaal niet initialiseren."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Kon SFTP niet initialiseren."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Verbonden"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Verbinden..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Bezig met verbinden met %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Afgebroken."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Gebufferde directoryweergave gebruikt."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Directoryweergave wordt opgehaald..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Bezig met overdracht..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Bezig met downloaden van bestand '%1'..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Bezig met uploaden van bestand '%1'..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Verwijderen..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Hernoemen..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Modus wijzigen..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Verbinding is mislukt."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"SSL-onderhandeling is geslaagd. De verbinding is beveiligd met %1 bits "
+"versleuteling %2."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL-onderhandeling is mislukt. Aanmelding is afgebroken."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL-onderhandelingsverzoek is mislukt. Aanmelding is afgebroken."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL-onderhandeling is mislukt. Verbindingsopbouw is afgebroken."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Verbonden met de server, wacht op welkomstbericht..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Kon niet verbinden (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Incompatibel adresfamilie voor PORT, maar EPRT niet ondersteund. Gestopt!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Verbinding wordt opgebouwd met %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Er kon geen luisterende socket worden opgezet."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Wacht op gegevensverbinding op poort %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Gegevensverbinding opgezet."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Gegevenskanaal beveiligd met %1 bit SSL"
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"SSL-onderhandeling voor de gegevenskanaal is mislukt. Overdracht is afgebroken."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Overdracht is voltooid."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Directory wordt aangemaakt..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"De servers ondersteunen geen SSCN/CPSV, maar SSL-gegevensverbinding verzocht. "
+"Overdracht gestopt!"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Bezig met overdracht van bestand '%1'..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Keep-alive wordt verzonden..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Geen verbinding."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Verbinding is verlopen."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Inactief."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Doorzoeken voltooid."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Doorzoeken van subdirectories wordt gestart..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Wacht %1 seconden voordat verbinding opnieuw wordt opgebouwd...."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Wachtende..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Probeert opnieuw verbinding te maken (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Probeert opnieuw te verbinden..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Nieuwe poging afgebroken."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Acties als het bestand bestaat (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Grootte/Tijdaanduiding"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Gelijk"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Ouder"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Nieuwer"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Kleiner"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Groter"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Overslaan"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Overschrijven"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Hervatten"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Hernoemen"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Vragen"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Log (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Lokale sessie"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Verbinding met %1 is met succes opgezet."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Voer het wachtwoord van uw private cryptografische sleutel in."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sessie"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Ten minste één sessie moet aan beide zijden open blijven."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Rond alle overdrachten af voor het sluiten van de sessie."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Deze sessie is verbonden. Weet u zeker dat u de verbinding wilt verbreken?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Sessie sluiten"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Snel ver&binden..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nieuwe sessie"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Linker zijde"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Rechter zijde"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Overdrach&tmodus (auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binair"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Overdrach&tmodus (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Overdrach&tmodus (binair)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Selecteren..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Geen naam"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Overdracht"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Beschrijving"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Er zijn geen mislukte overdrachten."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "Overdracht he&rstarten"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Aan wachtrij toevoegen"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Alles aan wachtrij toevoegen"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "V&erwijderen"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Alles verwijderen"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Weet u zeker dat u deze mislukte overdracht wilt verwijderen?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Weet u zeker dat u ALLE mislukte overdrachten wilt verwijderen?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nieuw patroon"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Bestandsnaampatroon:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Kleur:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Snel verbinden"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Wilt u de lijst met recentelijk geopende sites wissen?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "een hostnaam"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "een geldige poort"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "uw gebruikersnaam"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "uw wachtwoord"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " en"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Voer in"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Voer het wachtwoord in voor het ontcijferen van uw X509-certificaat."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Sites dichtbij"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Geen sites gepubliceerd"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Patroon"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Kleur"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Patroon toevoegen"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Ingeschakeld"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Accentuering"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Nog niet geïmplementeerd.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Lijst overslaan"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII-extensies"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Algemeen"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Overdrachten"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Weergave"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Acties"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filters"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Controlesomverificatie"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Controlesom"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verificatie voltooid"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Het controlesombestand kon niet worden geopend of heeft een onjuist formaat."
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filter acti&ef"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Geen filters."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Omhoog"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Omlaag"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Hernoemen..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Nieuw"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Regel hernoemen"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Regel '%1' hernoemen naar:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Voorwaarden"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Overeenkomen met a&l het volgende"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Overeen komen met &enkele van de volgende"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Zoeken & vervangen"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Gebruik van bandbreedte"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Meer"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Minder"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Beginwaarde"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "onderbroken"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "draait"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Wacht op verbinding..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Naam"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Bron"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Bestemming"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Voortgang"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Snelheid"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Er staan geen bestanden in de wachtrij."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Omlaag"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "Omhoog"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Threads"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Transfer &starten"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Transfer &afbreken"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "&Alles verwijderen"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "&Omhoog"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "O&mlaag"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Naar bovens&te"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Naar &onderste"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Overdrachtinformatie &bewerken"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Wachtrij uit bestand &laden"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "Wachtrij naar bestand op&slaan"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "S&tarten"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pauzeren"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Overdr&acht toevoegen"
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Zoeken & vervangen..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "&Filter tonen"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Site"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+"Weet u zeker dat u het bestand/ de bestanden in de wachtrij wilt verwijderen?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Weet u zeker dat u ALLE bestanden in de wachtrij wilt verwijderen?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Door het laden van een nieuwe wachtrij wordt de bestaande overschreven; wilt u "
+"doorgaan?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Wachtrij laden"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Site-sessie [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Thread %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "niet actief"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "geen verbinding"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "bezig met verbinden"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "bezig met overdracht"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Status"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Er zijn momenteel geen threads actief."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Geen bladwijzers."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nieuw..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "He&rnoemen"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "Sub&categorie aanmaken"
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Dupliceren"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr "Geef uw gebruikersnaam en wachtwoord op voor verbinding met deze site."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Site:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Categorienaam"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Categorie hernoemen:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nieuwe categorienaam"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nieuwe categorie:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Nieuwe server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Nieuwe server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Weet u zeker dat u deze categorie wilt verwijderen?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Weet u zeker dat u deze server wilt verwijderen?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Kon de geselecteerde import-plugin niet laden."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Het geselecteerde bestand bestaat niet of is onleesbaar."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Importeren van bladwijzers is voltooid."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "B&ewerken..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS-instellingen"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importeren..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exporteren..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP-bladwijzerbewerker"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>U staat op het punt uw KFTPGrabber-bladwijzers te exporteren. Exporteren "
+"kan onveilig zijn omdat de bladwijzers wachtwoorden of gevoelige "
+"X509-certificaten kunnen bevatten."
+"<br>"
+"<br>Wilt u doorgaan?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Bladwijzers exporteren"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Afbreken"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Boom&structuur weergeven"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "Eigenscha&ppen"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Vernietigen"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "&Filteropties"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Dit bestand altijd over&slaan bij in wachtrij plaatsen"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Dit bestand hoogs&te prioriteit geven"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Dit bestand &laagste prioriteit geven"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Overdrach&t"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Overdracht in &wachtrij plaatsen"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Directory aanmaken..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Bestand &openen"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verifiëren..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Meer acties"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "Hand&matig commando..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "Directoryweergave &exporteren..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Verbor&gen bestanden en mappen tonen"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Huidige directory in &Konqueror openen..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Ge&selecteerde items vergelijken"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Geselecteerde &directories vergelijken"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "&Rauw commando versturen"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "S&ite veranderen"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Snel verbinden"
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "Verbinden &met"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "Verbin&ding verbreken"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Codering op afstand v&eranderen"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Wilt u de huidige verbinding verbreken?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Weet u zeker dat u dit bestand wilt VERNIETIGEN?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Bestand vernietigen"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Wilt u dit item verwijderen?\n"
+"Wilt u deze %n items verwijderen?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Bestanden verwijderen"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "'%1' overslaan"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "'%1' prioriteit geven"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Directory aanmaken"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Directorynaam:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Ruw commando versturen"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Commando:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Directoryweergave exporteren"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Identieke bestanden op beide zijden zijn verborgen. Alleen <b>"
+"verschillende bestanden</b> zijn nu zichtbaar."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "Al&gemeen"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Map op afstand"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Type:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Locatie:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Grootte:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Aangemaakt:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Rechten"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Toegangsrechten"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klasse"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Items\n"
+"weergeven"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Lezen"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Items\n"
+"schrijven"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Schrijven"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Openen"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Uitvoeren"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Speciaal"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Gebruiker"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Groep"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Overige"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "UID instellen"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "GID instellen"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Vastgezet"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Wijzigingen toepassen op alle submappen en hun inhoud"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Hoofddirectory"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Pad: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Dit is een met SSH-versleutelde verbinding. Er is geen informatie over het "
+"certificaat beschikbaar."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Filteropties"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Mappen filteren"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Symbolische koppelingen filteren"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Hoofdlettergevoelig"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b>-logger geïnitialiseerd."
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Bestand kon niet geopend worden."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Kan %1 XML-GUI-beschrijvingsbestand niet vinden. Ga na of de toepassing "
+"correct geïnstalleerd is! Stel vragen op %2. "
+"<br>"
+"<br> <b>Waarschuwing:</b> Huidige GUI zal incompleet zijn!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Na het sluiten van het hoofdvenster blijft KFTPGrabber actief in het "
+"systeemvak. Gebruik <b>Afsluiten</b> in het <b>KFTPGrabber</b>"
+"-menu om het programma af te sluiten.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Naar systeemvak"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Er is een overdracht actief.\n"
+"Er zijn %n overdrachten actief."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Toch afsluiten?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP-sites dichtbij"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Sites in KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Bladwijzers bewerken..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Download: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Upload: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Wachtrij"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Mislukte overdrachten"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Sites dichtbij"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Threads"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Verkeer"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopie van"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Dit bladwijzerbestand is versleuteld. Voer een sleutel in voor ontcijfering."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>De ontcijfering van het bladwijzerbestand is mislukt met de opgegeven "
+"sleutel. Wilt u de bladwijzers <b>overschrijven</b> met een leeg bestand?"
+"<br>"
+"<br><font color=\"red\"><b>Let op:</b> Wanneer u kiest om te overschrijven gaan "
+"alle bladwijzers verloren.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Ontcijfering mislukt"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "Bladwijzers &overschrijven"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Voer de sleutel voor de versleuteling van het bladwijzerbestand in."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Geen diensten gepubliceerd>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD niet beschikbaar>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Geen sites in KWallet>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Rinse de Vries, Maarten Rütten"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "rinsedevries@kde.nl, maartenrutten@kde.nl"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Weergave"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Bestands&beheerder"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Verbor&gen bestanden en mappen tonen"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Directorystructuur &tonen"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "Bestandsgrootte in b&ytes tonen (omschakelen voor leesbaar formaat)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Eigenaar en groep voor elk bestand t&onen"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Directory&grootte tonen"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "&Andere interface-elementen"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Linker zijbalk tonen"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Rij zoeken en vervangen"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Met dit dialoog kunt u een groot aantal vervangingen van bron/doel paden van de "
+"overdrachten in de wachtrij uitvoeren. <b>Wijzigingen kunnen niet ongedaan "
+"gemaakt worden.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Zoeken"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Doel:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Bron:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Alleen naar overdrachten op een bepaalde server zoeken"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Serverinformatie"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Servernaam:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Poort:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Vervangen door"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Bladwijzer-importeer-assistent"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Stap 1: <b>Import plugin selecteren</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Afbeelding"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Selecteer de juiste import-plugin uit de onderstaande lijst. Elke plugin "
+"importeert een ander formaat."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Beschikbare import-plugins:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Stap 2: <b>Te importeren bladwijzerbestand selecteren</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Selecteer het bladwijzerbestand waaruit u uw bladwijzers wilt importeren. Een "
+"standaard pad is al opgegeven door de import-plugin."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Pad naar bladwijzers:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Stap 3: <b>Bladwijzers importeren...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Even geduld terwijl de bladwijzers geïmporteerd worden."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Importvoortgang:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Uiterlijk"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Lettertypen && kleuren"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Lettertype:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Kleur clientcommando:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Serverantwoordkleur:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Veelvoudige-regel-kleur"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Kleur foutmelding:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Statusberichtkleur:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Uitvoer"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&Bestandsuitvoer"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Log op&slaan naar bestand"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Uitvoerbestand:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Bronserverinformatie"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Doelserverinformatie"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Bron:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Doel:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Overdrachttype:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Verbi&nding"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP van actieve verbinding"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "PORT/EPRT afdwingen het geconfigureerde IP-adres te gebr&uiken"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/hostnaam:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "Extern &IP negeren voor LAN-verbindingen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Poortbereik van actieve verbinding"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Alleen poorten uit het opgegeven poortbereik gebr&uiken"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Minimum poort:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Maximum poort:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Timeouts"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Timeout in seconden voor verbindingscontrole:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Timeout in seconden voor gegevensoverdracht:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Snelheidslimiet"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Download: (KB/s)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Upload: (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Schij&fruimte"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Op vrije ruimte controleren"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Overdracht afbreken als er o&nvoldoende vrije ruimte is"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Interval (sec):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimale vrije ruimte (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Thre&ads"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Aantal threads per sessie:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Primaire verbinding gebruiken voor overdrachten"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Diversen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Mislukte overdrachten automatisch opnieuw proberen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Maximum aantal pogingen voordat als mislukt wordt beschouwd:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Overige"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"Bestanden in wachtrij zetten in plaats van versturen wanneer ze &versleept "
+"worden"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Leg&e mappen overslaan bij in wachtrij plaatsen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "&Bevestiging vragen voor verbinding verbreken"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Hostnaam:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocol:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP via TLS/SSL (expliciet)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP via TLS/SSL (impliciet)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP via SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Sitenaam:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Externe directory:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Lokale directory:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonieme aanmelding"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "Ge&avanceerd"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Uitge&breide passieve modus uitschakelen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Passieve modus uitschakelen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Site-IP voor verbindingen in passieve modus gebruiken"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr " \"Actieve modus voor dit IP forceren\" uitschakelen voor deze site"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "STAT voor directoryweergaven gebruiken"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Veelvoudige overdracht-threads"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Veelvoudige threads voor deze site niet gebruiken"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Servercodering"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Codering:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Opnieuw en &Keepalive"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Bij mislukte poging &opnieuw verbinden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Opnieuw proberen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Aantal pogingen (0 = oneindig):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Wachttijd tussen pogingen:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Keepalive-pakketten gebruiken om de verbinding open te houden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Keepalive"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Keepalive-frequentie (seconden):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII-e&xtensies"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Extensie toevoegen"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Extensie:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Extensie"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Recente verbindingen"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Verbinding selecteren:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL-adres:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Voer het gehele URL-adres in in het tekstvak"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "FTP hostnaam invoeren"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "&Anonieme aanmelding"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Optie voor anoniem aanmelden controleren"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Accountgebruikersnaam invoeren"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Accountwachtwoord invoeren"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Aan &bladwijzers toevoegen"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Instellingen gegevensverbinding"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Modus:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Gegevenskanaal altijd versleutelen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Alleen directoryweergaven versleutelen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Gegevenskanaal niet versleutelen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 certificaat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Gebruik bij het verbinden het volgende SSL-certificaat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Pad:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-mail&adres"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "E-mail adres &uit het configuratiecentrum gebruiken"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-mail:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Opstarten en afsluiten"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Programma afsluiten bevestigen als er a&ctieve overdrachten zijn"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "&Het programma geminimaliseerd in het systeemvak starten"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Welkom&stscherm bij opstarten"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "P&ictogram in systeemvak plaatsen"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Standaard afsluit&en als op de X-knop wordt geklikt"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Site standaarden"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Het bladwij&zerbestand versleutelen"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "&Sites van KWallet bij de bladwijzers weergeven"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Notificatie"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Tekstballonnen"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Tek&stballon tonen als de overdracht voltooid is"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Alleen l&aten zien wanneer de wachtrij leeg is na de overdracht"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "&Tekstballon weergeven als opnieuw verbinden lukt"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Bestand:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "geen"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Bestandslijst"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Niet verwerkt"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Ok"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Niet gevonden"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Mislukt"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "De grootte van het hoofdvenster."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "De positie van het hoofdvenster op het scherm."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+"Standaard aantal keren dat opnieuw verbinden geprobeerd wordt voor nieuwe "
+"sites."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Standaard vertraging tussen opnieuw verbinden voor nieuwe sites."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+"Moet een tekstballon weergegeven worden als enkele acties voltooid zijn."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Moet een tekstballon weergegeven worden als alle overdrachten in de wachtrij "
+"voltooid zijn."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Moet een tekstballon weergegeven worden als er alsnog een verbinding is gemaakt "
+"na een mislukte poging."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+"Moet het afsluiten van het programma bevestigt worden als er actieve "
+"overdrachten zijn."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Status van het versleutelen van het bladwijzerbestand."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Standaard lokale directory."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Moet het programma worden beëindigd als er op de X-knop wordt geklikt."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Moet de toepassing geminimaliseerd starten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+"Moet het opstartscherm weergegeven worden bij het starten van de toepassing."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Moet het systeemvakpictogram weergegeven worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Moeten de sites van KWallet bij de bladwijzers weergegeven worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Moet een \"verbinding verbreken bevestigen\" dialoog weergegeven worden bij "
+"elke keer dat het verbreken van de verbinding verzocht wordt."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "De standaardcodering van de site."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Recente sites die via snelverbinden zijn benaderd"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Een lijst van bestandspatronen waarbij de ASCII-modus gebruikt dient te worden "
+"voor overdracht."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Moeten lege mappen overgeslagen worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Het lettertype dat gebruikt moet worden voor het log-widget."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "De kleur van de commando's die naar de server verzonden worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "De kleur van de antwoorden van de server."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+"De kleur van de antwoorden van de server bestaande uit meerdere regels."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "De kleur van de foutberichten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "De kleur van de statusberichten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Moet het log ook naar een bestand geschreven worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Het bestand waar het log naar toe geschreven moet worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Moet er een poort uit een opgegeven poortbereik geselecteerd worden voor "
+"actieve overdrachten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Het begin van het poortbereik."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Het einde van het poortbereik."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Moet een IP-adres vervangen worden bij actieve overdrachten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "Het te verzenden IP-adres bij het vervangen van het PORT commando."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Moet het externe IP worden genegeerd bij LAN-verbindingen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Moeten de overdrachten in de wachtrij gezet worden in plaats van gestart worden "
+"als er gesleept wordt."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Moet KFTPGrabber nagaan of er voldoende ruimte is en afbreken indien er te "
+"weinig vrije ruimte is."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Interval voor het controleren van diskruimte."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Minimaal beschikbare vrije ruimte (in MiB)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Het globale KDE e-mailadres gebruiken voor anonieme wachtwoorden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "Het e-mailadres dat gebruikt moet worden voor anonieme wachtwoorden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Aantal bij overdracht te gebruiken threads per sessie."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Moet de standaardverbinding worden gebruikt bij overdrachten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tijdslimiet (in seconden) voor de beheerverbinding."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tijdslimiet (in seconden) voor data overdrachten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Globaal limiet voor downloadsnelheid (KB/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Globaal limiet voor uploadsnelheid (KB/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Moeten mislukte overdrachten automatisch opnieuw worden gestart."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"Maximum aantal pogingen voordat een overdracht als mislukt wordt beschouwd."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Moet de directorystructuur standaard weergegeven worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Moeten verborgen bestanden weergegeven worden tijdens het bladeren."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Moet de bestandsgrootte weergegeven worden in bytes in plaats van in een door "
+"mensen makkelijker leesbare vorm."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Moeten de gebruiker en de groep voor elk bestand weergegeven worden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Directorygrootte tonen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Linker zijbalk tonen."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Hoofdmenu"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Bladwijzerbalk"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Geen gebruikersnaam opgegeven voor '%1'."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Fout bij verbinden"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "DisplaySettings"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "KFTPQuickConnectLayout"
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/kftpgrabber.po b/translations/pl/messages/kftpgrabber.po
new file mode 100644
index 0000000..421299a
--- /dev/null
+++ b/translations/pl/messages/kftpgrabber.po
@@ -0,0 +1,3464 @@
+# translation of kftpgrabber.po to Polish
+#
+# Krzysztof Lichota <lichota@mimuw.edu.pl>, 2005, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-03-21 18:12+0100\n"
+"Last-Translator: Marek Gawryszewski <mgawry@wpk.p.lodz.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-Poedit-Language: polish\n"
+"X-Poedit-Country: poland\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "łączenie"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Katalog"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Ściągnij"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Wyślij"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+#, fuzzy
+msgid "Filename"
+msgstr "Plik:"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Wielkość"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "Zmien witrynę"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Cel"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+#, fuzzy
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+#, fuzzy
+msgid "All queued transfers have been completed."
+msgstr "Wszystkie kolejkowane transfery zostały zakończone!"
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Plik istnieje"
+
+#: src/main.cpp:50
+#, fuzzy
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - klient FTP dla KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Główny programista"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Developer"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "kod LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr ""
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr ""
+
+#: src/main.cpp:72 src/main.cpp:73
+#, fuzzy
+msgid "Testing and debugging"
+msgstr "Testowanie i debugowanie"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Nazwa katalogi"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Transfer nasępujących plików został zakończony:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "Połączenie z '%1' nie udało się."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "Przesyłanie plików nie powiodło się."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Prawa dostępu"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Nie można otworzyc do zapisu!"
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Transfer następujących plików <b>został przerwany</b> "
+"z powodu braku wolnego miejsca na '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Nie można ustanowić połączenia SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+#, fuzzy
+msgid "Logging in..."
+msgstr "Błąd logowania."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Błąd logowania."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+#, fuzzy
+msgid "Unable to initialize SFTP channel."
+msgstr "Nie mozna uruchomić kanału SFTP!"
+
+#: src/engine/sftpsocket.cpp:187
+#, fuzzy
+msgid "Unable to initialize SFTP."
+msgstr "Nie można uruchomić SFTP!"
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "rozłączony"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Łączenie..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Łączenie z '%1:%2\"..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "Przerwij"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+#, fuzzy
+msgid "Fetching directory listing..."
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "przesyłanie"
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Katalog zdalny:"
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Zmiana nazwy"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Połączenie z '%1' nie udało się."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Nie można ustanowić połączenia."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Ponowne łączenie (%1%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Nie można ustanowić połączenia TLS!"
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Ponowne łączenie..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Ustanowiono połączenie."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "Tryb transferu:"
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Opuszczaj puste katalogi"
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "przesyłanie"
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "rozłączony"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Połączenie z '%1' nie udało się."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr ""
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Czekam %1 sekund przed ponownym łączeniem..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Zmiana nazwy"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Ponowne łączenie..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Ponowne łączenie..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Powtórzenie przerwane."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Starszy"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Młodszy"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Mniejszy"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Większy"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Opuść"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Zastąp"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Wznowienie"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Zmiana nazwy"
+
+#: src/kftpfileexistsactions.cpp:107
+#, fuzzy
+msgid "Ask"
+msgstr "Zapytaj"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Log (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Sesja lokalna"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Log"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Połączenie z %1 zostało poprawnie ustanowione."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sesja"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+#, fuzzy
+msgid "Please finish all transfers before closing the session."
+msgstr "Proszę zakończyć wszystkie transfery przed zamknięciem sesji!"
+
+#: src/kftpsession.cpp:910
+#, fuzzy
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "Ta sesja jest aktualnie połączona. Czy na pewno rozłączyć?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Zamknij sesję"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Szybkie Łączenie..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nowa sesja"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Lewa strona"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Prawa strona"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "tryb transferu (automatycznie)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binarny"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Tryb transferu (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Tryb transferu (binarny)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Wybierz..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "brak nazwy"
+
+#: src/widgets/failedtransfers.cpp:59
+#, fuzzy
+msgid "Transfer"
+msgstr "&Transfer"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Opis"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+#, fuzzy
+msgid "&Restart Transfer"
+msgstr "Uruchom transfer"
+
+#: src/widgets/failedtransfers.cpp:118
+#, fuzzy
+msgid "&Add To Queue"
+msgstr "Wczytaj kolejkę"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+#, fuzzy
+msgid "R&emove"
+msgstr "Usuń wszystko"
+
+#: src/widgets/failedtransfers.cpp:121
+#, fuzzy
+msgid "Remove All"
+msgstr "Usuń wszystko"
+
+#: src/widgets/failedtransfers.cpp:180
+#, fuzzy
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Czy na pewno chcesz usunąć ten serwer?"
+
+#: src/widgets/failedtransfers.cpp:188
+#, fuzzy
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Czy na pewno chcesz usunąć WSZYSTKIE kolejkowane pliki?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nowy wzór"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "wzór nazwy pliku:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Kolor..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Szybkie połącznie"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "nazwa hosta"
+
+#: src/widgets/quickconnect.cpp:289
+#, fuzzy
+msgid "a valid port"
+msgstr "prawidłowy port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "Twoja nazwa użytkownika"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "Twoje hasło"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr "i"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Wprowadź"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Witryny blisko Ciebie"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+#, fuzzy
+msgid "No sites published."
+msgstr "Brak opublikowanych witryn."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Wzór"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Kolor"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Dodaj wzór"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Włączone"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Podświetlenie"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Jeszcze nie zaimplementowane.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "rozszerzenia ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Ogólne"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Transfery"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Wyświetlanie"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Akcje"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+#, fuzzy
+msgid "Filters"
+msgstr "Filtr"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr ""
+
+#: src/widgets/verifier.cpp:137
+#, fuzzy
+msgid "Verification complete!"
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Plik:"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filtr"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Ściągnij"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Zmiana nazwy"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Młodszy"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Zmiana nazwy"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "łączenie"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Znajdź i zamień"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Użycie pasma."
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+#, fuzzy
+msgid "stalled"
+msgstr "opóźniony"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "uruchomiony"
+
+#: src/widgets/queueview/queueview.cpp:303
+#, fuzzy
+msgid "Waiting for connection..."
+msgstr "Ponowne łączenie..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtr:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nazwa"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Źródło"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Cel"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Postęp"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Prędkość"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+#, fuzzy
+msgid "You do not have any files in the queue."
+msgstr "Nie masz żadnych plików w kolejce."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Ściągnij"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Wątki"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Uruchom transfer"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Przerwij transfer"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Usuń wszystko"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Przenieś wyżej"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Przenieś niżej"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Przenieś wyżej"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+#, fuzzy
+msgid "&Change Transfer Info"
+msgstr "Zmień informacje o przesyłaniu"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Wczytaj kolejkę z pliku"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "Zapisz kolejkę do piku"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "S&tart"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pauza"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Dodaj transfer..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "Znajdź i zamień..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+#, fuzzy
+msgid "Show &Filter"
+msgstr "Filtr"
+
+#: src/widgets/queueview/queueview.cpp:704
+#, fuzzy
+msgid "Site"
+msgstr "Wielkość"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Czy na pewno chcesz usunąć kolejkowane pliki?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Czy na pewno chcesz usunąć WSZYSTKIE kolejkowane pliki?"
+
+#: src/widgets/queueview/queueview.cpp:834
+#, fuzzy
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Wczytanie nowej kolejki zastąpi aktualną! Czy na pewno chcesz kontynuować?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Wczytaj kolejkę"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Wątek %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "rozłączony"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "łączenie"
+
+#: src/widgets/queueview/threadview.cpp:113
+#, fuzzy
+msgid "transferring"
+msgstr "przesyłanie"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Status"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Żaden wątek nie jest obecnie uruchomiony."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Brak zakładek."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Nowy..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+#, fuzzy
+msgid "&Rename"
+msgstr "Zmień nazwę"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "Utwórz podkategorię..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+#, fuzzy
+msgid "&Duplicate"
+msgstr "Duplikaty"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Wielkość"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Nazwa kategorii"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Przemianuj kategorię:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nowa nazwa kategorii"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nowa kategoria:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Nowy serwer"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Nowy serwer"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Czy na pewno chcesz usunąć ta kategorię?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Czy na pewno chcesz usunąć ten serwer?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+#, fuzzy
+msgid "Unable to load the selected import plugin."
+msgstr "Nie można uruchomić wybranehen wtyczki importowania!"
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+#, fuzzy
+msgid "The selected file does not exist or is not readable."
+msgstr "Wybrany plik nie istnieje lub jest nieczytelny!"
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+#, fuzzy
+msgid "Bookmark importing is complete."
+msgstr "Importowanie zakładek zakończone!"
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Edycja..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Ustawienia SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importuj..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+#, fuzzy
+msgid "Export..."
+msgstr "Importuj..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Edytor zakładek FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+#, fuzzy
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Chcesz wysłać swoje zakładki KFTPGrabbera do <b>%1</b>"
+"! Mogą one zawierać hasła lub certyfikaty X509! Wysyłanie ich może obniżyć ich "
+"bezpieczeństwo. "
+"<br>"
+"<br>Jesteś pewien?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+#, fuzzy
+msgid "Export Bookmarks"
+msgstr "Edytuj Zakładki..."
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "Przerwij"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Pokaż widok drzewa"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "Właściwości"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "Podzielone"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Edytor filtrów"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Transfer"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Kolejkuj transfer"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "Utwórz katalog..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "Więcej akcji"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+#, fuzzy
+msgid "&Export Directory Listing..."
+msgstr "Utwórz katalog..."
+
+#: src/widgets/browser/actions.cpp:136
+#, fuzzy
+msgid "Show &Hidden Files && Directories"
+msgstr "Pokaż ukryte pliki i katalogi"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Edytor filtrów"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+#, fuzzy
+msgid "&Change Site"
+msgstr "Zmien witrynę"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Szybkie łączenie..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "Połącz z"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "Rozłącz"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Czy chcesz porzucić aktualne połączenie?"
+
+#: src/widgets/browser/actions.cpp:326
+#, fuzzy
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Czy na pewno chcesz PODZIELIĆ ten plik?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Podzielone pliki"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "usuń plik"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Opuść"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Port:"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Utwórz katalog"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Nazwa katalogi"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Polecenie:"
+
+#: src/widgets/browser/actions.cpp:648
+#, fuzzy
+msgid "Export Directory Listing"
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "Ogólne"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Katalog zdalny"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Typ:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Położenie:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Wielkość:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Utworzony:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Prawa dostępu"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Prawa dostępu"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klasa"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Pokaż\n"
+"Wpisy"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "odczyt"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Zapisz\n"
+"wpisy"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Zapis"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Specjalny"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Użytkownik"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupa"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Inni"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Ustaw UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Ustaw GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "bit \"Sticky\""
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Katalog główny"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Ścieżka:"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"To jest połączenie z szyfrowaniem SSH. Brak informacji o certyfikatach."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Edytor filtrów"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Edytor filtrów"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Plik istnieje"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "Zmien witrynę"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "Dziennik <b>KFTPGrabbera</b> został włączony.<br>"
+
+#: src/widgets/logview.cpp:94
+#, fuzzy
+msgid "Unable to open file for writing."
+msgstr "Nie można otworzyc do zapisu!"
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Zamknięcie głównego okna spowoduje ukrycie działającego KFTPGrabbera w "
+"zasobniku systemowym. Uzyj <b>Zamknij</b> z menu <b>KFTPGrabber</b> "
+"aby zamknąc program.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Dokowanie z zasobniku systemowym"
+
+#: src/mainwindow.cpp:242
+#, fuzzy, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Obecnie jest uruchomionych %1 transferów.\n"
+"Na pewno chcesz zamknąć program?"
+
+#: src/mainwindow.cpp:243
+#, fuzzy
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr "Czy na pewno chcesz PODZIELIĆ ten plik?"
+
+#: src/mainwindow.cpp:300
+#, fuzzy
+msgid "FTP Sites Near Me"
+msgstr "FTP blisko mnie"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr ""
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Edytuj Zakładki..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Download: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Upload: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Kolejkuj"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, fuzzy, no-c-format
+msgid "Failed Transfers"
+msgstr "Transfery"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Strony blisko położone"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Wątki"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Przesyłanie"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopia"
+
+#: src/kftpbookmarks.cpp:307
+#, fuzzy
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Ta zakładka jest zaszyfrowana. Podaj klucz do odszyfrowania!"
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Odszyfrowanie nieudane."
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "Zastąp Zakładki"
+
+#: src/kftpbookmarks.cpp:386
+#, fuzzy
+msgid "Enter key for bookmark file encryption."
+msgstr "Wprowadź klucz do odszyfrowania zakładek!"
+
+#: src/kftpbookmarks.cpp:825
+#, fuzzy
+msgid "<No Services Published>"
+msgstr "Brak opublikowanych witryn."
+
+#: src/kftpbookmarks.cpp:830
+#, fuzzy
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD niedostępny>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+#, fuzzy
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+"_: NAME OF TRANSLATORS\n"
+"marek Gawryszewski"
+
+#: _translatorinfo.cpp:3
+#, fuzzy
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"_: EMAIL OF TRANSLATORS\n"
+"mgawry@wpk.p.lodz.pl"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Displa&y"
+msgstr "Wyświetlanie"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Pokaż ukryte pliki i katalogi"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "Show &directory tree"
+msgstr "Katalog główny"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Katalog główny"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Filtr"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, fuzzy, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Uzywając tego okienka, możesz zmienić ścieżki źródłowe/docelowe wielu "
+"kolejkowanych plików. <b>Zmiany nie będą mogły być cofnięte!</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Cel:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Źródło:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Server Info"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Nazwa serwera:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Hasło:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Nazwa użytkownika:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Zamień z"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Asystent importowania zakładek"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Krok 1: <b>Wybierz wtyczkę Importuj</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Obrazek"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Proszę wybrać właściwą wtyczkę importowania z listy poniżej. Każda wtyczka może "
+"importowaź z innego formatu."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Dostępne wtyczki importowania:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Krok 2: <b>Wybierz plik do importowania</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Proszę wybrać plik z którego chcesz importować Zakładki. Domyślna ścieżka jest "
+"ustawiana przez wtyczkę."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Ścieżka dostępu do Zakładek: </b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Krok 3: <b>Importowanie Zakładek... </b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Proszę czekać, aż zakładki zostaną zaimportowane."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Postęp pimortowania:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, fuzzy, no-c-format
+msgid "Font && Colors"
+msgstr "Czcionki i kolory dziennika"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, fuzzy, no-c-format
+msgid "Font:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Kolor odpowiedzi serwera:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, fuzzy, no-c-format
+msgid "Error message color:"
+msgstr "Kolor błędu:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Kolor informacji statusu:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, fuzzy, no-c-format
+msgid "&Save log to file"
+msgstr "Zapisz log do pliku"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Informacje o serwerze źródłowym"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Informacje o serwerze docelowym"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Źródło:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Cel:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Typ transferu:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, fuzzy, no-c-format
+msgid "Co&nnection"
+msgstr "łączenie"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, fuzzy, no-c-format
+msgid "Active Connection IP"
+msgstr "Uastawienia aktywnych połączeń"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, fuzzy, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Wymuszaj PORT/EPORT do użycia skonfigurowanego IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, fuzzy, no-c-format
+msgid "IP/hostname:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, fuzzy, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Uastawienia aktywnych połączeń"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, fuzzy, no-c-format
+msgid "Speed limit"
+msgstr "Prędkość"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Download (KB/s):"
+msgstr "Download: %1/s"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Upload: %1/s"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Dis&k Space"
+msgstr "Sprawdzenie wolnego miejsca na dysku"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Sprawdzenie wolnego miejsca na dysku"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Zatrzymaj transfer jeśli jest za mało wolnego miejsca na dysku."
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimalne wolne miejsce na dysku (mb):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Thre&ads"
+msgstr "Wątki"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Liczba wątków w sesji:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Inne"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Opuszczaj puste katalogi"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "ftpSiteProperties"
+msgstr "Właściwości"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Host:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokół:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, fuzzy, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP przez TLS/SSL (explicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, fuzzy, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP przez TLS/SSL (implicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP przez SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, fuzzy, no-c-format
+msgid "Site label:"
+msgstr "Etykieta strony:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Katalog zdalny:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Katalog lokalny:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, fuzzy, no-c-format
+msgid "&Anonymous login"
+msgstr "Logowanie anonimowe"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, fuzzy, no-c-format
+msgid "&Advanced"
+msgstr "Zaawansowane"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, fuzzy, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Wyłącz używanie rozszerzonego tyrbu pasywnego"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Wyłącz używanie trybu pasywnego"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Transfer wielowątkowy"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Nie używaj wielu wątków dla tej witryny"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Kodowanie serwera"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kodowanie:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, fuzzy, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Powtórz łączenie po błędzie"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Powtórz"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Liczba powtórzeń ( 0 = nieskończoność ):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Oczekiwanie między powtórzeniem:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, fuzzy, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "Edytor filtru..."
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, fuzzy, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "Rozszerzenia ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Dodaj rozszerzenie"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Rozszerzenie:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Rozszerzenie"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Ponowne łączenie..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Ponowne łączenie..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Wprowadź cały URL w tym polu"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Wpisz nazwę hosta ftp"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, fuzzy, no-c-format
+msgid "Anon&ymous login"
+msgstr "Logowanie anonimowe"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Sprawdź możliwość logowania anonimowego"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Wpisz nazwę użytkownika"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Wpisz hasło"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, fuzzy, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Dodaj do zakładek"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Zaawansowane"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Ustanowiono połączenie."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Certyfikat X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Używaj następującego certyfikatu SSL podczas łączenia"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Scieżka:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, fuzzy, no-c-format
+msgid "E-mail &Address"
+msgstr "Adres email:"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, fuzzy, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "Użyj adresu email z Centrum Sterowania"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, fuzzy, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Potwierdzaj zamkniecie jeśli są aktywne transfery"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, fuzzy, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Uruchamiaj zminimalizowany do Zasobnika Systemowego"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, fuzzy, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Pokazuj ekran powitalny przy uruchamianiu"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, fuzzy, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Szyfruj plik zakładek"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, fuzzy, no-c-format
+msgid "&Notification"
+msgstr "Opcje powiadomień"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Pokaż powiadomienie po zakończeniu transferu"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, fuzzy, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Pokaż informację po zakończonym powodzeniem powtórnym łączeniu"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, fuzzy, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Źródło:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, fuzzy, no-c-format
+msgid "File list"
+msgstr "Plik istnieje"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, fuzzy, no-c-format
+msgid "Failed"
+msgstr "Filtr"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Pokaż powiadomienie po zakończeniu transferu"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Pokaż powiadomienie po zakończeniu transferu"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, fuzzy, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Potwierdzaj zamkniecie jeśli są aktywne transfery"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, fuzzy, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Szyfruj plik zakładek"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, fuzzy, no-c-format
+msgid "Default local directory."
+msgstr "Domyślny katalog lokalny:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, fuzzy, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Opuszczaj puste katalogi"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, fuzzy, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Liczba wątków w sesji:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Potwierdzaj zamkniecie jeśli są aktywne transfery"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, fuzzy, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Czekam %1 sekund przed ponownym łączeniem..."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Katalog główny"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Filtr"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Główne menu"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Pasek Zakładek"
+
+#, fuzzy
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Nie podano nazwy urzytkownika dla '%1!'"
+
+#~ msgid "Error Connecting"
+#~ msgstr "Błąd podczas łączenia"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Wyświetlanie"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Szybkie połącznie"
+
+#~ msgid "Command"
+#~ msgstr "Polecenie"
+
+#~ msgid "What's this?"
+#~ msgstr "Co to jest?"
+
+#~ msgid "Server Management"
+#~ msgstr "Zarządzanie serwerem"
+
+#, fuzzy
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+
+#, fuzzy
+#~ msgid "Username"
+#~ msgstr "Nazwa użytkownika:"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Wprowadź nazwę urzytkownika lub kliknij Anuluj"
+
+#~ msgid "Group name"
+#~ msgstr "Nazwa grupy"
+
+#~ msgid "Description name"
+#~ msgstr "Nazwa opisu"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Wprowadź opis lub kliknij Anuluj"
+
+#, fuzzy
+#~ msgid "Passwords do not match"
+#~ msgstr "Hasła nie są identyczne"
+
+#~ msgid "Optional"
+#~ msgstr "Opcjonalnie"
+
+#~ msgid "Password retype:"
+#~ msgstr "Powtórz hasło:"
+
+#~ msgid "Display your idle time"
+#~ msgstr "Wyświetl Twój czas bezczynnosci"
+
+#~ msgid "This will change your password"
+#~ msgstr "Tu możesz zmienić swoje hasło."
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Tu możesz zmienić swoje hasło.<br>Hasła mogą mieć długość do 8 znaków."
+
+#~ msgid "Display the group info"
+#~ msgstr "Wyświetl informacje o grupie"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Wyświetl informacje o grupie<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Pokaż aktualne aliasy"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Pokaż aktualną wersję gftpd"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Pokaż aktualną wersję gftpd<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Wyswietlaj uzytkowników online"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Wyswietlaj uzytkowników online<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Wyświetlaj ekran powitalny"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Wyświetlaj ekran powitalny<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Usuń urzytkownika, może zostać ponownie dodany za pomocą READD"
+
+#, fuzzy
+#~ msgid "Change user's password"
+#~ msgstr "Zmień hasło uzytkownika"
+
+#~ msgid "Readd user"
+#~ msgstr "Dodaj ponownie użytkownika"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Pokaż dostępne grupy"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Pokaż szczegółowe informacje o grupach"
+
+#~ msgid "Add a new group"
+#~ msgstr "Dodaj nową grupę"
+
+#~ msgid "Delete a group"
+#~ msgstr "Usuń grupę"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Zmień opis grupy"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Wyświetlaj akutalną linię statusu"
+
+#, fuzzy
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Pokaż nieudane logowania"
+
+#, fuzzy
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Pokaż nieudane logowania"
+
+#~ msgid "Display server traffic"
+#~ msgstr "Wyswietlaj ruch serwera"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Wyświetl okno pomocy"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Wyświetl okno pomocy<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Pokaż nieudane logowania"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Pokaż szczegółowe informacje o użytkownikach online"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Pokazuj szczegółowe informacji o użtkownikach online<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "Wyślij zakładki do"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<brak dostępnych kontaktów>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Wyłączone w tej wersji KDE>"
+
+#, fuzzy
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Chcesz wysłać swoje zakładki KFTPGrabbera do <b>%1</b>! Mogą one zawierać hasła lub certyfikaty X509! Wysyłanie ich może obniżyć ich bezpieczeństwo. <br><br>Jesteś pewien?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Wyślij zakładki"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Czy na pewno chcesz usunąć ten plik(i)?"
+
+#~ msgid "Date"
+#~ msgstr "Data"
+
+#~ msgid "Permissions"
+#~ msgstr "Prawa dostępu"
+
+#, fuzzy
+#~ msgid "Owner"
+#~ msgstr "Inne"
+
+#, fuzzy
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Nie można otworzyć katalogu '%1'!"
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr "katalog zawiera %1 plików."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Wyswietlenie wszystkiego może zająć trochę czasu."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Jesteś pewien?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "przesyłanie"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Ustawienia transferu"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Dodaj nowy wzór"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Czy na pewno usunąć ten wzór?"
+
+#, fuzzy
+#~ msgid "&Other"
+#~ msgstr "Inne"
+
+#, fuzzy
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Podświetlenie"
+
+#, fuzzy
+#~ msgid "&Add Pattern..."
+#~ msgstr "Dodaj wzór..."
+
+#, fuzzy
+#~ msgid "E&dit..."
+#~ msgstr "Edytuj..."
+
+#, fuzzy
+#~ msgid "Re&move"
+#~ msgstr "Usuń wszystko"
+
+#, fuzzy
+#~ msgid "E&nabled"
+#~ msgstr "Włączone"
+
+#, fuzzy
+#~ msgid "Priority pattern:"
+#~ msgstr "Wzór omijania:"
+
+#~ msgid "Patterns"
+#~ msgstr "Wzorce"
+
+#, fuzzy
+#~ msgid "&Add Pattern"
+#~ msgstr "Dodaj wzorzec"
+
+#, fuzzy
+#~ msgid "&Skip"
+#~ msgstr "Opuść"
+
+#, fuzzy
+#~ msgid "Priority List Settings"
+#~ msgstr "Ustawienia listy omijania"
+
+#, fuzzy
+#~ msgid "E&nable priority list"
+#~ msgstr "Włącz listę omijania"
+
+#, fuzzy
+#~ msgid "S&kip empty files"
+#~ msgstr "Opuszczaj puste pliki"
+
+#, fuzzy
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Zastosuj listę omijania do katalogów"
+
+#, fuzzy
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Nie kolejkuj plików z listy omijania"
+
+#, fuzzy
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Nie kolejkuj plików z listy omijania"
+
+#, fuzzy
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Zastosuj listę omijania do katalogów"
+
+#, fuzzy
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Nie kolejkuj plików z listy omijania"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "UStaw filtr..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Wyczyść filtr"
+
+#~ msgid "Filter"
+#~ msgstr "Filtr"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Podaj filtr:"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "Edytor zakładek FTP"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "Ustawienia TLS/SSL"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Tryb transferu:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - prywatny (integralność i prywatność)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - poufny (prywatność bez integralności)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - bezpieczny (integralność bez prywatności)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - czysty (bez SSL)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Połączenie nieudane (%1)"
+
+#~ msgid "Transfer:"
+#~ msgstr "Transfer:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Ściąganie:%1/s Wysyłanie: %1/s"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Rozpoczęcie ściągania '%1' pliku(-ów)"
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Rozpoczęcie wysyłania '%1' pliku(-ów)"
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Uruchomienie trybu chronionego nie powiodło się, powrót do połączenia bez szyfrowania."
+
+#, fuzzy
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Nieznany host '%1'"
+
+#, fuzzy
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "nie można ustanowić wyłącznego połączenia SSL!"
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Ustanowiono wyłączne połączenie SSL."
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#, fuzzy
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Nie można połączyć się z serwerem!"
+
+#, fuzzy
+#~ msgid "Disconnected from server."
+#~ msgstr "Rozłączony z serwerem."
+
+#, fuzzy
+#~ msgid "Unable to connect with server."
+#~ msgstr "Nie można połączyć się z serwerem!"
+
+#, fuzzy
+#~ msgid "Directory is not in cache."
+#~ msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#, fuzzy
+#~ msgid "Unable to open directory."
+#~ msgstr "Nie można otworzyć katalogu!"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Tryb Offline"
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Wyświetlanie zawartości katalogu zakończone."
+
+#~ msgid "Transfered %1 bytes."
+#~ msgstr "Przesłano %1 bajtów."
+
+#~ msgid "CRC check matches - file integrity was verified."
+#~ msgstr "Sumy CRC zgadzają się - poprawność pliku potwierdzona."
+
+#~ msgid "Warning: CRC check failed. Downloaded file may be corrupted."
+#~ msgstr "Uwaga: błąd CRC. Ściągnięty plik może być uszkodzony."
+
+#, fuzzy
+#~ msgid "Script & Event Editor"
+#~ msgstr "Edytor Skryptów i Zarzeń"
+
+#~ msgid "Event Name"
+#~ msgstr "Nazwa Zdarzenia"
+
+#~ msgid "Script Editor"
+#~ msgstr "Edytor skryptów"
+
+#~ msgid "This code cannot be saved, because it contains syntax errors! Do you want to return to editing?"
+#~ msgstr "Ten kod nie może zostać zapisany, ponieważ zawiera błędy składni. Czy chcesz wrócić do edycji?"
+
+#~ msgid "Syntax Error"
+#~ msgstr "Błąd składni"
+
+#~ msgid "&Script Editor..."
+#~ msgstr "Edytor skryptów..."
+
+#~ msgid "Preferences"
+#~ msgstr "Właściwości"
+
+#~ msgid "General Preferences"
+#~ msgstr "Ogólne ustawienia"
+
+#~ msgid "Unknown (FXP)"
+#~ msgstr "Nieznany(FXP)"
+
+#~ msgid "User name"
+#~ msgstr "nazwa użytkownika"
+
+#~ msgid "Here you can set, how the log output will look like. You can set different output colors and you can enable log writing to a file."
+#~ msgstr "Tu mozesz ustawić, jak będzie wyglądał dziennik(log). Możesz ustalić różne kolory oraz włączyć zapisywanie dziennika do pliku."
+
+#~ msgid "Log font:"
+#~ msgstr "Czcionka dziennkia:"
+
+#~ msgid "UNKNOWN_FONT"
+#~ msgstr "NIEZNANA_CZCIONKA"
+
+#~ msgid "Here you can change various display options that affect current file view."
+#~ msgstr "Tutaj możesz zmienić różne ustawienia wyświetlania dotyczące aktualnego widoku plików."
+
+#~ msgid "File View"
+#~ msgstr "Widok plików"
+
+#~ msgid "Show tree view"
+#~ msgstr "Pokaż widok drzewa"
+
+#~ msgid "Show filesize in bytes"
+#~ msgstr "Pokaż wielkość pliku z bajtach"
+
+#~ msgid "<i>If you select this option, you will not be able to access your bookmarks without a valid key! You will be prompted to set the key, when you exit the application.</i>"
+#~ msgstr "<i>Jeśli wybierzesz tą opcję, nie będziesz miał dostępu do zakładek bez właściwego klucza! Będziesz poproszony o ustawienie klucza przy zamykaniu programu.</i>"
+
+#~ msgid "Here you can set some options that will affect how transfer connections are established and some defaults about queuing transfers."
+#~ msgstr "Tutaj możesz ustawić kilka opcji, które dotyczą sposobu ustanawiania połączeń i kilku ustawień domyslnych dotyczących kolejkowania transferów."
+
+#~ msgid "IP address/hostname:"
+#~ msgstr "adres IP/nazwa hosta:"
+
+#~ msgid "Queue files when dropped via \"Drag && Drop\""
+#~ msgstr "kolejkuj pliki przeciągnięte metodą \"Przeciągnij i upuść\""
+
+#~ msgid "Email Address to Use as Password on Anonymous Servers"
+#~ msgstr "Adress email używany jako hasło na serwerach anonimowych"
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/kftpgrabber.po b/translations/pt/messages/kftpgrabber.po
new file mode 100644
index 0000000..cbed3a7
--- /dev/null
+++ b/translations/pt/messages/kftpgrabber.po
@@ -0,0 +1,2984 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-04-10 11:05+0100\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: Transfer\n"
+"X-POFile-SpellExtra: logs Sites syslog glftpd LibSSH PORT log SFTP siteops\n"
+"X-POFile-SpellExtra: gFTP KWallet EPRT emulate who FXP NcFTP otpCalc\n"
+"X-POFile-SpellExtra: KopeteBalloon KFTPGrabber login seen STAT\n"
+"X-POFile-SpellExtra: ftpSiteProperties and drag drop kftpgrabber MiB\n"
+"X-POFile-IgnoreConsistency: Alt+S\n"
+"X-POFile-IgnoreConsistency: Filename\n"
+"X-POFile-SpellExtra: KFTPQuickConnectLayout exp TransferSettings\n"
+"X-POFile-SpellExtra: KFTPFilterEditorLayout GeneralSettings\n"
+"X-POFile-IgnoreConsistency: Alt+Y\n"
+"X-POFile-SpellExtra: DisplaySettings FileZilla CPSV SSCN GID UID Exec\n"
+"X-POFile-IgnoreConsistency: Alt+B\n"
+"X-POFile-IgnoreConsistency: Resume\n"
+"X-POFile-IgnoreConsistency: Up: \n"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "contém"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "não contém"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "igual a"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "é diferente de"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "corresponde à exp. regular"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "não corresponde à exp. regular"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "é"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "não é"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Pasta"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "é maior que"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "é menor que"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "bytes"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Seleccione por favor uma acção."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Prioridade:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Obter"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Enviar"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+"Obteve-se uma marca desconhecida ao processar os comandos personalizados do "
+"'site'!"
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>A operação pedida falhou! A resposta do servidor é:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Não se encontrou a rotina de tratamento <b>%1</b> "
+"para o processamento da resposta!</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Nome do ficheiro"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Tipo de Item"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Tamanho"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Mudar a prioridade"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Saltar ao colocar em espera"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Colorir na lista"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Esconder na lista"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Destino em minúsculas"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Regra Sem Nome"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Importar do gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "Importar do KFTPGrabber"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Importar do NcFTP"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "Importação do FileZilla 3"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Todas as transferências escalonadas terminaram."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "O Ficheiro Existe"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - um cliente de FTP para o KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "Um URL opcional onde se ligar"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Gestão do desenvolvimento"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Desenvolvimento"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "Código da LibSSH"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "Código do otpCalc"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Código do aviso KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Item do gráfico de tráfego"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Desenho dos ícones"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Testes e depuração"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Código do processador de pastas"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Código de tratamento da coluna da lista"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "A transferência dos seguintes ficheiros terminou:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "A ligação ao servidor foi mal-sucedida."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "A autenticação no servidor foi mal-sucedida."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "O ficheiro de origem não foi encontrado."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "A permissão foi negada."
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr "Não foi possível aceder ao ficheiro local para leitura ou escrita."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "A transferência falhou por alguma razão."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"A transferência dos seguintes ficheiros <b>foi interrompida</b> "
+"porque não há espaço suficiente em '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Não foi possível estabelecer a ligação de SSH (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "A ligar..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Ligado ao servidor, a tentar autenticar-se..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "A autenticação falhou."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "A autenticação interactiva com o teclado teve sucesso."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "A autenticação com chave pública teve sucesso."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Não foi possível inicializar o canal de SFTP."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Não foi possível inicializar o SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Ligado."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "A ligar..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "A efectuar a ligação a %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Interrompido."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "A usar a listagem da pasta em 'cache'."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "A obter a listagem da pasta..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "A transferir..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "A obter o ficheiro '%1'..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "A enviar o ficheiro '%1'..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "A remover..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "A mudar o nome..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "A modificar o modo..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "A ligação foi mal-sucedida."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"A negociação de SSL teve sucesso. A ligação está segura com uma cifra %2 de %1 "
+"bits."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "A negociação de SSL falhou. A autenticação foi interrompida."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "O pedido de negociação de SSL falhou. A autenticação foi interrompida."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "A negociação de SSL falhou. A ligação foi interrompida."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Ligado ao servidor; à espera da mensagem de boas-vindas..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Não é possível estabelecer a ligação (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+"Família de endereços incompatível do PORT, com o EPRT não suportado, a "
+"interromper!"
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "A estabelecer a ligação de dados com o %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Não foi possível estabelecer um 'socket' para atender pedidos."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "À espera da ligação de dados no porto %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "A ligação de dados foi estabelecida."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "O canal de dados está seguro com SSL de %1 bits."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+"A negociação de SSL para o canal de dados falhou. A interromper a "
+"transferência."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "A transferência terminou."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "A criar a pasta..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Nenhum dos servidores suporta o SSCN/CPSV, mas foram pedidos dados de SSL; a "
+"transferência será interrompida!"
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "A transferir o ficheiro '%1'..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "A transmitir o sinal de vida..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Desligado."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "A ligação expirou."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Parado."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Pesquisa completa."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "A iniciar a pesquisa recursiva da pasta..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "À espera %1 segundos antes de ligar de novo..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "À espera..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "A repetir a ligação (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "A repetir a ligação..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "A repetição foi interrompida."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Acções no Caso de o Ficheiro Existir (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Tamanho/Hora"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Mesmo"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Mais Antigo"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Mais Recente"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Menor"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Maior"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Ignorar"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Sobrepor"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Continuar"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Mudar o Nome"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Perguntar"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Registo (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Sessão Local"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Registo"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "A ligação a %1 foi estabelecida com sucesso."
+
+#
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Por favor indique a senha para decifrar a sua chave privada."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sessão"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Deverá permanecer aberta pelo menos uma sessão de cada lado."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Termine por favor todas as transferências antes de fechar a sessão."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "Esta sessão está ligada de momento. Tem a certeza que deseja desligar?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Fechar a Sessão"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Liga&ção Rápida..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nova Sessão"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Lado Esquerdo"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "Lado Di&reito"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Modo de &Transferência (Auto)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binário"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Auto"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Modo de &Transferência (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Modo de &Transferência (Binário)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Seleccionar..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Sem nome"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Transferência"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Descrição"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Não existem transferências mal-sucedidas."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Reiniciar a Transferência"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Adicionar à Fila"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Adicionar Tudo à Fila"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "R&emover"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Remover Tudo"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Tem a certeza que deseja remover esta transferência mal-sucedida?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+"Tem a certeza que deseja remover todas as transferências mal-sucedidas?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Novo Padrão"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Padrão do nome do ficheiro:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Cor:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Ligação Rápida"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Deseja limpar a lista dos servidores acedidos recentemente ?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "um nome de máquina"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "um porto válido"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "o seu utilizador"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "a sua senha"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " e"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Por favor introduza "
+
+#
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Por favor indique a senha de descodificação do certificado X509."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "'Sites' Próximo de Si"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Não estão publicados quaisquer 'sites'."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Padrão"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Cor"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Adicionar um padrão"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Activo"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Realce"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Ainda não implementado.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Ignorar a Lista"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "Extensões ASCII"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Geral"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Transferências"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Visualização"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Acções"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filtros"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Verificação de integridade"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Código"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verificação completa!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+"Não foi possível abrir o ficheiro com códigos de integridade ou este tem um "
+"formato incorrecto!"
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filtro a&ctivo"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Sem filtros."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Subir"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Descer"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Mudar o Nome..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Novo"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Mudar o Nome da Regra"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Mudar o nome da regra '%1' para:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Condições"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Corresponder a &todos os seguintes"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Corresponder a &qualquer um dos seguintes"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Procurar e Substituir"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Utilização da largura de banda"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Mais"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Menos"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Limpar"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "parado"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "a correr"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "À espera de ligação..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filtro: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Origem"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Destino"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Evolução"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Velocidade"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Não tem ficheiros na fila."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr "Limitar a velocidade na recepção"
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "Recepção: "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr "Limitar a velocidade no envio"
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "Envio: "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr "Número de tarefas de transferência por sessão"
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "Tarefas: "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Iniciar a Tran&sferência"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "Interromper &a Transferência"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Remover &Tudo"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "S&ubir"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "&Descer"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Mover para o &Topo"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Mover para o &Fundo"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Modifi&car a Informação de Transferência"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "Carregar a Fi&la de um Ficheiro"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "Gravar a Fila num &Ficheiro"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "&Iniciar"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pausa"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Adicionar uma Transferência..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "Procurar e &Substituir..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Mostrar o &Filtro"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Servidor"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Tem a certeza que deseja remover os ficheiros em fila de espera?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Tem a certeza que deseja remover TODOS os ficheiros em fila de espera?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"O carregamento de uma nova fila irá sobrepor a existente; tem a certeza que "
+"deseja continuar?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Carregar a Fila"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Sessão do 'site' [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Tarefa %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "parado"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "desligado"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "a ligar"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "a transferir"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Estado"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Não existem tarefas em execução de momento."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Sem favoritos."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Novo..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "Muda&r o Nome"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Criar uma Sub-Categoria..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplicar"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+"Por favor indique o seu utilizador e a senha para se ligar a este servidor."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "'Site':"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Nome da Categoria"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Mudar o nome da categoria:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nome Novo da Categoria"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nova categoria:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Novo servidor"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Novo Servidor"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Tem a certeza que deseja remover esta categoria?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Tem a certeza que deseja remover este servidor?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Não foi possível carregar o 'plugin' de importação seleccionado."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "O ficheiro seleccionado não existe ou não está acessível para leitura."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "A importação de favoritos terminou."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Editar..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "Configuração do SSL/TLS"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importar..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exportar..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Editor de Favoritos de FTP"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Você está prestes a enviar os seus favoritos do KFTPGrabber. Eles poderão "
+"conter senhas ou certificados X509 importantes: o envio dos seus favoritos "
+"poderá comprometer a sua segurança."
+"<br>"
+"<br>Tem a certeza?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Exportar os Favoritos"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "Não foi possível entrar na pasta %1."
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Interromper"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Mo&strar a Árvore"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Propriedades"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "De&struir"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "Opções do &Filtro"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "&Saltar sempre este ficheiro quando estiver em espera"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Colocar este ficheiro com prioridade de &topo"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Co&locar este ficheiro com prioridade de mínima"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Transferir"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Transferência na &Fila"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Criar a Directoria..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Abrir um ficheir&o"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verificar..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Mais Acções"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "Introdução &Manual de Comandos..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Exportar a Listagem da Pasta..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Mostrar os Fic&heiros e Pastas Escondidas"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Abrir a pasta actual no &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Comparar os itens &seleccionados"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Comparar as &pastas"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Enviar um Comando em B&ruto"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "Modifi&car o 'Site'"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "Li&gação Rápida..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Ligar a"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Desligar"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Mudar a Codificação R&emota"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Deseja quebrar a ligação actual?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Tem a certeza que deseja DESTRUIR este ficheiro?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Destruir o Ficheiro"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Deseja mesmo apagar este item?\n"
+"Deseja mesmo apagar estes %n itens?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Apagar os Ficheiros"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Saltar o '%1'"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Prioridade '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Criar a Pasta"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Nome da pasta:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Enviar um Comando em Bruto"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Comando:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Exportar a Listagem da Pasta"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Os ficheiros idênticos em ambos os lados foram escondidos. Só estão visíveis os "
+"<b>ficheiros diferentes</b>."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Geral"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Pasta remota"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tipo:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Localização:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Dimensões:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Criado:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Permissões"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Permissões de Acesso"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Classe"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Mostrar os\n"
+"Itens"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Ler"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Escrever os\n"
+"Itens"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Escrever"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Entrar"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Exec"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Especial"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Utilizador"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupo"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Outros"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Mudar o UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Mudar o GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Fixo"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Aplicar as alterações a todas as subpastas e ao seu conteúdo"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Pasta de raiz"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Localização: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Esta é uma ligação encriptada com SSL. Não está disponível a informação "
+"certificado para esta."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Opções do Filtro"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Pastas do Filtro"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Ligações Simbólicas do Filtro"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Distinguir Capitalização"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "O registo do <b>KFTPGrabber</b> começou.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Não foi possível aceder ao ficheiro para escrita."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Não foi possível encontrar o ficheiro descritor da GUI em XML %1. Por favor "
+"verifique se instalou a aplicação correctamente! Se tiver algumas dúvidas, por "
+"favor pergunte a %2."
+"<br>"
+"<br><b>Atenção:</b> A GUI actual ficará incompleta!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Se fechar a janela principal irá manter o KFTPGrabber a correr na bandeja do "
+"sistema. Use a opção <b>Sair</b> do menu <b>KFTPGrabber</b> "
+"para sair da aplicação.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Acoplagem na Bandeja do Sistema"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Existe de momento uma transferência em curso.\n"
+"Existem de momento %n transferências em curso."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Tem a certeza que deseja sair?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "'Sites' de FTP Perto de Mim"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "'Sites' na KWallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Editar os Favoritos..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Recepção: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Envio: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Fila"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Transferências Falhadas"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "'Sites' Perto de Mim"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Tarefas"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Tráfego"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Cópia de"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Este ficheiro de favoritos está encriptado. Indique por favor a chave para o "
+"descodificar."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>A descodificação do ficheiro de favorito falhou com a chave fornecida. "
+"Deseja <b>sobrepor</b> os favoritos com um ficheiro vazio ?"
+"<br>"
+"<br><font color=\"red\"><b>Atenção:</b> Se o sobrepor, todos os favoritos "
+"actuais serão perdidos.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "A Descodificação Falhou"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "S&obrepor os Favoritos"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Indique a chave para descodificar o ficheiro de favoritos."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Sem Serviços Publicados>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD Indisponível>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Sem 'Sites' na KWallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Visualização"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Na&vegador de Ficheiros"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Mostrar os fic&heiros e pastas escondidos"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Mostrar a árvore &de pastas"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"&Mostrar o tamanho do ficheiro em 'bytes' (comute para o formato \"legível\")"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Mostrar &o dono e o grupo de cada ficheiro"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Mostrar o tamanho da pa&sta"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "&Outros Elementos da Interface"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Mostrar a barra lateral esquerda"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Procurar e Substituir na Fila"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Se usar esta janela, poderá fazer uma substituição maciça dos locais de "
+"origem/destino das transferências na fila de espera.<b>"
+"As alterações não poderão ser anuladas.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Procurar o Quê"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Destino:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Origem:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Procurar apenas pelas transferências de um dado servidor"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Informação do Servidor"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Nome do servidor:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Máquina:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Senha:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Utilizador:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Porto:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Substituir Por"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Assistente de Importação de Favoritos"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Passo 1: <b>Seleccionar o 'Plugin' de Importação</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Imagem"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Seleccione por favor um 'plugin' de importação apropriado na lista abaixo. Cada "
+"'plugin' poderá importar a partir de um formato diferente."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "'Plugins' de importação disponíveis:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Passo 2: <b>Seleccionar o Ficheiro de Favoritos a Importar</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Seleccione por favor o ficheiro de favoritos de onde deseja importar os seus "
+"favoritos. Já foi determinada uma localização por omissão pelo filtro de "
+"importação."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Local dos favoritos:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Passo 3: <b>A Importar os Favoritos...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Espere por favor enquanto os favoritos são importados."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Progresso da importação:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Aparência"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Tipos de Letra e Cores"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Tipo de letra:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Cor dos comandos do cliente:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Cor da resposta do servidor:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Cor das resposta multi-linha:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Cor da mensagem de erro:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Cor das mensagens de estado:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "Resultad&o"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Resultado num &Ficheiro"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Guardar o regi&sto num ficheiro"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Ficheiro de saída:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Informação do Servidor de Origem"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Informação do Servidor de Destino"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Origem:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Destino:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Tipo de transferência:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "Liga&ção"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP da Ligação Activa"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Obrigar o PORT/EPRT a &usar o IP configurado"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/nome da máquina:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "&Ignorar o IP externo nas ligações LAN"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Gama de Portos das Ligações Activas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Usar apenas os portos do &intervalo indicado"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Porto mínimo:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Porto máximo:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Tempos Limite"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Tempo-limite da ligação de controlo (em segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Tempo-limite da transferência de dados (em segundos):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Limite de Velocidade"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Recepção (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Envio (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Es&paço em Disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Verificação do Espaço Livre em Disco"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Parar a tra&nsferência se não houver espaço livre suficiente"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervalo (s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Espaço livre mínimo (MB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "T&arefas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Número de tarefas por sessão:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Usar a ligação primária nas transferências"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Diversos"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Repetir automaticamente as transferências mal-sucedidas"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Máximo de repetições antes de marcar como mal-sucedido:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Outros"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+"Colocar os ficheiros em &fila (em vez de transferir) no \"drag && drop\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Saltar as pastas vazias ao colocar em &espera"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Confirmar os encerramentos antes de desli&gar"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteProperties"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Máquina:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protocolo:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP sobre TLS/SSL (explícito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP sobre TLS/SSL (implícito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP sobre SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Legenda do 'site':"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Pasta remota:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Pasta local:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Autenticação anónima"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Avançado"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Desact&ivar o uso do modo passivo extendido"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Desactivar o uso do modo passivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Usar o IP do servidor nas ligações de modo passivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr "Desactivar o \"forçar o modo activo para usar este IP\" neste servidor"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Utilizar STAT para listagens de pastas"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Várias Tarefas de Transferência"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Não usar várias tarefas para este 'site'"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Codificação do Servidor"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Codificação:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Repetir e Manter &Vivo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Repet&ir a ligação em caso de falha"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Repetir"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Número de repetições (0 = infinito):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Atraso na repetição:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Usar os pacotes de sinal de vida para manter a ligação aberta"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Sinal de vida"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Frequência do sinal de vida (segundos):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "E&xtensões em ASCII"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Adicionar uma Extensão"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Extensão:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Extensão"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Ligações recentes"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Seleccione a ligação:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Indique o URL completo nesta opção"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Indique o nome da máquina de FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Autent&icação anónima"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Verificar a autenticação anónima"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Indique o utilizador da conta"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Indique a senha da conta"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Adicionar aos fa&voritos"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avançado"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Configuração da Ligação de Dados"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Modo:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Encriptar sempre o canal de dados"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Encriptar apenas nas listagens de pastas"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Não encriptar o canal de dados"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "Certificado X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Usar o seguinte certificado de SSL ao ligar"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Localização:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "Endereço de E-m&ail"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Usar o endereço de e-mail do centro de controlo"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-mail:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Inicio e Fim"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Confirmar a saída do programa se e&xistirem transferências activas"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Iniciar o programa minimi&zado na bandeja"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Mo&strar o ecrã inicial no início"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Mostrar o ícone na &bandeja"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Sair por om&issão ao carregar no botão X"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Predefinições do Sítio"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "C&ifrar o ficheiro de favoritos"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Mo&strar os 'sites' do KWallet entre os favoritos"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Notificação"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Balões"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Mo&strar um balão quando a transferência terminar"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Só mostrar &quando a fila estiver vazia após a transferência"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Mostrar um balão quando a repet&ição de ligação for bem-sucedida"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Ficheiro:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "nenhum"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Lista de ficheiros"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Não processado"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "OK"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Não encontrado"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Falhou"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "O tamanho da janela principal."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "A posição da janela principal no ecrã."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "O número de repetições predefinido para os 'sites' novos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "O atraso de repetições predefinido para os 'sites' novos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Se deve mostrar um balão quando algumas acções terminarem."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Se deve mostrar um balão quando todas as transferências em fila de espera "
+"terminarem."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Se deve mostrar um balão quando for estabelecida com sucesso uma ligação ao "
+"servidor após a repetição."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+"Se o utilizador deve confirmar a saída no caso de existirem transferências "
+"activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "O estado de encriptação do ficheiro de favoritos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "A pasta local por omissão."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+"Se a aplicação deve sair, quando os utilizadores carregarem no botão X."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Se a aplicação deve ser iniciada minimizada."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Se o ecrã inicial deve ser mostrado ao iniciar a aplicação."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Se o ícone da bandeja deverá ser mostrado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Se os 'sites' do KWallet devem ser mostrados entre os favoritos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Se deve ser mostrada uma janela de \"confirmação do encerramento\" de cada vez "
+"que termina uma ligação."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "A codificação por omissão do 'site'."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Máquinas recentes acedidas através das ligações rápidas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Uma lista de padrões de ficheiros onde o modo ASCII deverá ser usado na "
+"transferência."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Se as pastas vazias devem ser ignoradas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "O tipo de letra usado para a janela de registo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "A cor dos comandos enviados ao servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "A cor das respostas do servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "A cor das respostas em várias linhas do servidor."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "A cor das mensagens de erro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "A cor das mensagens de estado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Se o registo também deverá ser gravado num ficheiro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "O ficheiro onde o registo também deverá ser gravado."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Se deve ser seleccionado um porto do intervalo indicado nas transferências "
+"activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "O início do intervalo de portos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "O fim do intervalo de portos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Se deve ser usado em substituição um IP nas transferências activas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "O IP a enviar no caso de substituir o comando PORT."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Se o IP externo deverá ser ignorado nas ligações LAN."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Se as transferências devem ser colocadas em fila em vez de iniciadas no 'drag "
+"and drop'."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Se o 'kftpgrabber' deve verificar o espaço livre e interromper a transferência "
+"no caso de faltar espaço."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "O intervalo de verificação do disco."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Espaço livre mínimo (em MiB) que deverá estar disponível."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Usar o endereço de e-mail do KDE para as senhas anónimas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "O endereço de e-mail que deverá ser usado nas senhas anónimas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Número de tarefas a usar na transferência."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Se deverá ser usada a ligação primária nas transferências."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tempo-limite (em segundos) para a ligação de controlo."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tempo-limite (em segundos) para as transferências de dados."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Limite global de velocidade da recepção (kbps)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Limite global de velocidade de envio (kbps)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+"Se as transferências mal-sucedidas deverão ser repetidas automaticamente."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+"O número máximo de repetições antes de marcar a transferência como "
+"mal-sucedida."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Se a árvore de pastas deve estar visível por omissão."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Se os ficheiros escondidos devem aparecer na navegação."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Se o tamanho do ficheiro deve ser mostrado em 'bytes' em vez de um \"formato "
+"legível\"."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Se o dono e o grupo devem ser mostrados para cada ficheiro."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Mostrar o tamanho da pasta."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Mostrar a barra lateral esquerda."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Menu Principal"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Barra de Favoritos"
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/kftpgrabber.po b/translations/rw/messages/kftpgrabber.po
new file mode 100644
index 0000000..646d121
--- /dev/null
+++ b/translations/rw/messages/kftpgrabber.po
@@ -0,0 +1,3987 @@
+# translation of kftpgrabber to Kinyarwanda.
+# Copyright (C)
+# This file is distributed under the same license as the kftpgrabber 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: kftpgrabber 3.4\n"
+"POT-Creation-Date: 2007-04-15 07:14+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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "Kwihuza..."
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Ububiko"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Icyihutirwa"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Iyimura"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Gushyiraho"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, fuzzy, no-c-format
+msgid "FXP"
+msgstr "FTP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Izina ry'idosiye"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Ingano"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "Yobora ama site"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Ishyika"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+#, fuzzy
+msgid "gFTP import"
+msgstr "Kuzana "
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+#, fuzzy
+msgid "KFTPGrabber import"
+msgstr "Kuzana "
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+#, fuzzy
+msgid "NcFtp import"
+msgstr "Kuzana "
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+#, fuzzy
+msgid "All queued transfers have been completed."
+msgstr "Yashizwe ku murongo Byarangiye . "
+
+#: src/kftpqueue.cpp:723
+#, fuzzy
+msgid "File Exists"
+msgstr "Idosiye "
+
+#: src/main.cpp:50
+#, fuzzy
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "- Umukiriya ya: MukusanyaKDE "
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr ""
+
+#: src/main.cpp:64
+#, fuzzy
+msgid "Lead developer"
+msgstr "Mukoraporogaramu "
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Mukoraporogaramu"
+
+#: src/main.cpp:67
+#, fuzzy
+msgid "LibSSH code"
+msgstr "Inyandikoporogaramu "
+
+#: src/main.cpp:68
+#, fuzzy
+msgid "otpCalc code"
+msgstr "Inyandikoporogaramu "
+
+#: src/main.cpp:69
+#, fuzzy
+msgid "KopeteBalloon popup code"
+msgstr "Byirambuye Inyandikoporogaramu "
+
+#: src/main.cpp:70
+#, fuzzy
+msgid "Traffic graph widget"
+msgstr "Itondeka ry'igika"
+
+#: src/main.cpp:71
+#, fuzzy
+msgid "Icon design"
+msgstr "Ihangagishusho "
+
+#: src/main.cpp:72 src/main.cpp:73
+#, fuzzy
+msgid "Testing and debugging"
+msgstr "na "
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Izina y'ububiko:"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+#, fuzzy
+msgid "Transfer of the following files is complete:"
+msgstr "Bya i Idosiye ni Byuzuye : "
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "Kuri ' %1 ' Byanze . "
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "Idosiye Byanze . "
+
+#: src/kftptransferfile.cpp:231
+#, fuzzy
+msgid "Source file cannot be found."
+msgstr "Idosiye Byabonetse . "
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Uruhushya"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Ntibishobotse gufungura idosiye''kugira wandike"
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+#, fuzzy
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Bya i Idosiye <b> Byahagaritswe </b> ni OYA Kigenga Umwanya Ibumoso: ku ' %1 ' "
+": "
+
+#: src/engine/sftpsocket.cpp:129
+#, fuzzy
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Kuri Ukwihuza ( %1 ) "
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+#, fuzzy
+msgid "Logging in..."
+msgstr "in ... "
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Kwinjira Byanze."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+#, fuzzy
+msgid "Unable to initialize SFTP channel."
+msgstr "Kuri gutangiza . "
+
+#: src/engine/sftpsocket.cpp:187
+#, fuzzy
+msgid "Unable to initialize SFTP."
+msgstr "Kuri gutangiza . "
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "Byatandukanye"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Kwihuza..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Kwihuza na\"%1\"..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "Kureka"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "Ububiko ... "
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+#, fuzzy
+msgid "Fetching directory listing..."
+msgstr "Ububiko ... "
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Yoherejwe"
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "ububiko bw'amaderese ... "
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Guhindura izina"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Kuri ' %1 ' Byanze . "
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Kuri Kwihuza . "
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Ukwihuza ( %1 /%2 ) ... "
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Kuri Ukwihuza . "
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "ya: Ukwihuza ... "
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Ukwihuza kwanze."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "Byarangiye . "
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "ububiko bw'amaderese ... "
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Yoherejwe"
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "Byatandukanye"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Kuri ' %1 ' Byanze . "
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+#, fuzzy
+msgid "Idle."
+msgstr "Bigenda buhoro"
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Byuzuye ! "
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Ububiko ... "
+
+#: src/engine/connectionretry.cpp:66
+#, fuzzy
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "%1 amasogonda Mbere ... "
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Guhindura izina"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Ukwihuza ... "
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Ukwihuza ... "
+
+#: src/engine/connectionretry.cpp:93
+#, fuzzy
+msgid "Retry aborted."
+msgstr "Wongereugerageze Byahagaritswe . "
+
+#: src/kftpfileexistsactions.cpp:71
+#, fuzzy
+msgid "On File Exists Actions (%1)"
+msgstr "Idosiye ( %1 ) "
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+#, fuzzy
+msgid "Same"
+msgstr "Urugero"
+
+#: src/kftpfileexistsactions.cpp:83
+#, fuzzy
+msgid "Older"
+msgstr "Itondekanya"
+
+#: src/kftpfileexistsactions.cpp:86
+#, fuzzy
+msgid "Newer"
+msgstr "Bike"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Gitoya"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Kinini"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Gusimbuka"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Gusimbuza"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Guca make"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Guhindura izina"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Kubaza"
+
+#: src/kftpsession.cpp:327
+#, fuzzy
+msgid "Log (%1)"
+msgstr "LOG"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+#, fuzzy
+msgid "Local Session"
+msgstr "Gufunga Umukoro"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Gufunga"
+
+#: src/kftpsession.cpp:375
+#, fuzzy
+msgid "Connection with %1 has been successfully established."
+msgstr "Na: %1 . "
+
+#: src/kftpsession.cpp:388
+#, fuzzy
+msgid "Please provide your private key decryption password."
+msgstr "By'umwihariko Urufunguzo Ijambobanga . "
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Umukoro"
+
+#: src/kftpsession.cpp:900
+#, fuzzy
+msgid "At least one session must remain open on each side."
+msgstr "Rimwe Umukoro isigaye Gufungura ku . "
+
+#: src/kftpsession.cpp:905
+#, fuzzy
+msgid "Please finish all transfers before closing the session."
+msgstr "Kurangiza Byose Mbere i Umukoro . "
+
+#: src/kftpsession.cpp:910
+#, fuzzy
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "Umukoro ni . Kuri Gucomora ? "
+
+#: src/kftpsession.cpp:910
+#, fuzzy
+msgid "Close Session"
+msgstr "Gufunga umukoro"
+
+#: src/mainactions.cpp:77
+#, fuzzy
+msgid "Quick &Connect..."
+msgstr "Kwihuza..."
+
+#: src/mainactions.cpp:78
+#, fuzzy
+msgid "&New Session"
+msgstr "Umukoro Mushya"
+
+#: src/mainactions.cpp:80
+#, fuzzy
+msgid "&Left Side"
+msgstr "Umurongoruhande w'Ibumoso"
+
+#: src/mainactions.cpp:81
+#, fuzzy
+msgid "&Right Side"
+msgstr "Umurongoruhande w'Iburyo"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+#, fuzzy
+msgid "&Transfer Mode (Auto)"
+msgstr "Kwimurira ku Gasuzumisho"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Nyabibiri"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "mwi-/nyamwi-"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr ""
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Guhitamo..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+#, fuzzy
+msgid "No name"
+msgstr "Izina: "
+
+#: src/widgets/failedtransfers.cpp:59
+#, fuzzy
+msgid "Transfer"
+msgstr "Yoherejwe"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Isobanuramiterere"
+
+#: src/widgets/failedtransfers.cpp:97
+#, fuzzy
+msgid "There are no failed transfers."
+msgstr "Oya Byanze . "
+
+#: src/widgets/failedtransfers.cpp:117
+#, fuzzy
+msgid "&Restart Transfer"
+msgstr "Kongera gutangiza Seriveri"
+
+#: src/widgets/failedtransfers.cpp:118
+#, fuzzy
+msgid "&Add To Queue"
+msgstr "Kwongera kuri:"
+
+#: src/widgets/failedtransfers.cpp:119
+#, fuzzy
+msgid "Add All To Queue"
+msgstr "ongera/teranya Byose"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "Vanaho"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Gukuraho Byose"
+
+#: src/widgets/failedtransfers.cpp:180
+#, fuzzy
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Kuri Gukuraho iyi Byanze ? "
+
+#: src/widgets/failedtransfers.cpp:188
+#, fuzzy
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Kuri Gukuraho Byanze ? "
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Ifishi1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, fuzzy, no-c-format
+msgid "New Pattern"
+msgstr "Umutako"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, fuzzy, no-c-format
+msgid "Filename pattern:"
+msgstr "Ishusho : "
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Ibara:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, fuzzy, no-c-format
+msgid "Quick Connect"
+msgstr "Amagenzura Yihuta"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+#, fuzzy
+msgid "a hostname"
+msgstr "A Izina ry'inturo: "
+
+#: src/widgets/quickconnect.cpp:289
+#, fuzzy
+msgid "a valid port"
+msgstr "A Byemewe Umuyoboro: "
+
+#: src/widgets/quickconnect.cpp:292
+#, fuzzy
+msgid "your username"
+msgstr "Izina ry'ukoresha "
+
+#: src/widgets/quickconnect.cpp:295
+#, fuzzy
+msgid "your password"
+msgstr "Ijambobanga "
+
+#: src/widgets/quickconnect.cpp:298
+#, fuzzy
+msgid " and"
+msgstr "na"
+
+#: src/widgets/quickconnect.cpp:301
+#, fuzzy
+msgid "Please enter "
+msgstr "Injiza "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+#, fuzzy
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Impamyabushobozi: Ijambobanga . "
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+#, fuzzy
+msgid "Sites Near You"
+msgstr "Ibice ku Rubariro"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+#, fuzzy
+msgid "No sites published."
+msgstr "Ama dosiye yose yatangajwe"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Umutako"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Ibara"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+#, fuzzy
+msgid "Add pattern"
+msgstr "Ishusho "
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Bikora"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Igaragaza cyane"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+#, fuzzy
+msgid "<b>Not yet implemented.</b>"
+msgstr "Ntibirarangira"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+#, fuzzy
+msgid "Skip List"
+msgstr "Gukoporora ilisiti"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+#, fuzzy
+msgid "ASCII xtensions"
+msgstr "Amayagura IPA"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Rusange"
+
+#: src/widgets/configdialog.cpp:70
+#, fuzzy
+msgid "Transfers"
+msgstr "Yoherejwe"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Kugaragaza"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Ibikorwa"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Muyunguruzi"
+
+#: src/widgets/verifier.cpp:58
+#, fuzzy
+msgid "Checksum verifier"
+msgstr "Umugenzuzi wa CA"
+
+#: src/widgets/verifier.cpp:66
+#, fuzzy
+msgid "Checksum"
+msgstr "Kugenzura"
+
+#: src/widgets/verifier.cpp:137
+#, fuzzy
+msgid "Verification complete!"
+msgstr "Byuzuye ! "
+
+#: src/widgets/verifier.cpp:143
+#, fuzzy
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Kuri Gufungura Idosiye Cyangwa Idosiye Imiterere ! "
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Izina ry'idosiye"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Muyunguruzi"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Iyimura"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Guhindura izina"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Bike"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Guhindura izina"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "Ukwihuza"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Gushakisha & Gusimbura"
+
+#: src/widgets/trafficgraph.cpp:429
+#, fuzzy
+msgid "Bandwidth usage"
+msgstr "Ikoresha: "
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+#, fuzzy
+msgid "stalled"
+msgstr "Byatindijwe"
+
+#: src/widgets/queueview/queueview.cpp:258
+#, fuzzy
+msgid "running"
+msgstr "Iburira"
+
+#: src/widgets/queueview/queueview.cpp:303
+#, fuzzy
+msgid "Waiting for connection..."
+msgstr "ya: Ukwihuza ... "
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+#, fuzzy
+msgid "Filter: "
+msgstr "Akayunguruzo:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Izina"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Inkomoko"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Ishyika"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Aho bigeze"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Umuvuduko"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+#, fuzzy
+msgid "You do not have any files in the queue."
+msgstr "OYA Icyo ari cyo cyose Idosiye in i Umurongo . "
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Iyimura"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Igikorwa"
+
+#: src/widgets/queueview/queueview.cpp:557
+#, fuzzy
+msgid "&Start Transfer"
+msgstr "Gutangira "
+
+#: src/widgets/queueview/queueview.cpp:558
+#, fuzzy
+msgid "&Abort Transfer"
+msgstr "Mucapirwaho"
+
+#: src/widgets/queueview/queueview.cpp:560
+#, fuzzy
+msgid "Remove &All"
+msgstr "Gukuraho Byose"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Kwimura hejuru"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Kwimura hasi"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Kwimura hejuru"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+#, fuzzy
+msgid "&Change Transfer Info"
+msgstr "Hindura ijambobanga ngenga"
+
+#: src/widgets/queueview/queueview.cpp:568
+#, fuzzy
+msgid "&Load Queue From File"
+msgstr "Idosiye "
+
+#: src/widgets/queueview/queueview.cpp:569
+#, fuzzy
+msgid "&Save Queue to File"
+msgstr "Kubika Kuri Idosiye "
+
+#: src/widgets/queueview/queueview.cpp:570
+#, fuzzy
+msgid "S&tart"
+msgstr "Tangira"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "Kuhagarara"
+
+#: src/widgets/queueview/queueview.cpp:573
+#, fuzzy
+msgid "&Add Transfer..."
+msgstr "Ongeraho mucapyi..."
+
+#: src/widgets/queueview/queueview.cpp:574
+#, fuzzy
+msgid "&Search && Replace..."
+msgstr "Gushakisha& Gusimbura"
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+#, fuzzy
+msgid "Show &Filter"
+msgstr "Erekana ububiko"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Ipaji"
+
+#: src/widgets/queueview/queueview.cpp:734
+#, fuzzy
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Kuri Gukuraho Yashizwe ku murongo Idosiye ( S ) ? "
+
+#: src/widgets/queueview/queueview.cpp:750
+#, fuzzy
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Kuri Gukuraho Yashizwe ku murongo Idosiye ? "
+
+#: src/widgets/queueview/queueview.cpp:834
+#, fuzzy
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr "A Gishya Umurongo Guhindura i Rimwe ; Kuri Gukomeza ? "
+
+#: src/widgets/queueview/queueview.cpp:834
+#, fuzzy
+msgid "Load Queue"
+msgstr "Umurongo"
+
+#: src/widgets/queueview/threadview.cpp:90
+#, fuzzy
+msgid "Site session [%1]"
+msgstr "Umukoro [ %1] "
+
+#: src/widgets/queueview/threadview.cpp:93
+#, fuzzy, c-format
+msgid "Thread %1"
+msgstr "Igikorwa"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+#, fuzzy
+msgid "idle"
+msgstr "Bigenda buhoro"
+
+#: src/widgets/queueview/threadview.cpp:95
+#, fuzzy
+msgid "disconnected"
+msgstr "Byatandukanye"
+
+#: src/widgets/queueview/threadview.cpp:111
+#, fuzzy
+msgid "connecting"
+msgstr "Kwihuza..."
+
+#: src/widgets/queueview/threadview.cpp:113
+#, fuzzy
+msgid "transferring"
+msgstr "Yoherejwe"
+
+#: src/widgets/queueview/threadview.cpp:119
+#, fuzzy
+msgid "FXP - [%1]"
+msgstr "%1 - [%2]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Imimerere"
+
+#: src/widgets/queueview/threadview.cpp:156
+#, fuzzy
+msgid "There are no threads currently running."
+msgstr "Oya Igikorwa . "
+
+#: src/widgets/bookmarks/listview.cpp:95
+#, fuzzy
+msgid "No bookmarks."
+msgstr "Ibimenyetso . "
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "Gishya..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "Guhindura izina"
+
+#: src/widgets/bookmarks/listview.cpp:115
+#, fuzzy
+msgid "&Create Subcategory..."
+msgstr "Urwego rw'igishushanyo"
+
+#: src/widgets/bookmarks/listview.cpp:116
+#, fuzzy
+msgid "&Duplicate"
+msgstr "Gusubiramo"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Ipaji"
+
+#: src/widgets/bookmarks/listview.cpp:367
+#, fuzzy
+msgid "Category Name"
+msgstr "Izina ry'icyiciro"
+
+#: src/widgets/bookmarks/listview.cpp:367
+#, fuzzy
+msgid "Rename category:"
+msgstr "Hindura izina ry'Icyiciro"
+
+#: src/widgets/bookmarks/listview.cpp:383
+#, fuzzy
+msgid "New Category Name"
+msgstr "Icyiciro gishya"
+
+#: src/widgets/bookmarks/listview.cpp:383
+#, fuzzy
+msgid "New category:"
+msgstr "Icyiciro gishya"
+
+#: src/widgets/bookmarks/listview.cpp:403
+#, fuzzy
+msgid "New server"
+msgstr "Seriveri: "
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+#, fuzzy
+msgid "New Server"
+msgstr "Seriveri y'amakuru"
+
+#: src/widgets/bookmarks/listview.cpp:473
+#, fuzzy
+msgid "Are you sure you want to remove this category?"
+msgstr "Kuri Gukuraho iyi Icyiciro ? "
+
+#: src/widgets/bookmarks/listview.cpp:480
+#, fuzzy
+msgid "Are you sure you want to remove this server?"
+msgstr "Kuri Gukuraho iyi Seriveri: ? "
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+#, fuzzy
+msgid "Unable to load the selected import plugin."
+msgstr "Kuri Ibirimo i Byahiswemo Kuzana Gucomeka: . "
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+#, fuzzy
+msgid "The selected file does not exist or is not readable."
+msgstr "Byahiswemo Idosiye OYA Cyangwa ni OYA . "
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+#, fuzzy
+msgid "Bookmark importing is complete."
+msgstr "Kuvana hanze... ni Byuzuye . "
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "Kwandika..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+#, fuzzy
+msgid "SSL/TLS Settings"
+msgstr "Amagenamiterere ya HTML"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Kuzana..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Kwimura..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+#, fuzzy
+msgid "FTP Bookmark Editor"
+msgstr "Muhindura Kirango"
+
+#: src/widgets/bookmarks/editor.cpp:197
+#, fuzzy
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr "<qt>Urabyemeyekoko."
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+#, fuzzy
+msgid "Export Bookmarks"
+msgstr "utumenyetso tw'igitabo cy'itumiza"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "Kureka"
+
+#: src/widgets/browser/actions.cpp:105
+#, fuzzy
+msgid "&Show Tree View"
+msgstr "Kwerekana Igaragazambere"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "Indangabintu"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+#, fuzzy
+msgid "&Shred"
+msgstr "Gucamo uduce"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Muyunguruzi"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "A Urutonde Bya Ryari: . "
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+#, fuzzy
+msgid "&Transfer"
+msgstr "Yoherejwe"
+
+#: src/widgets/browser/actions.cpp:126
+#, fuzzy
+msgid "&Queue Transfer"
+msgstr "iyimura ritunganye"
+
+#: src/widgets/browser/actions.cpp:127
+#, fuzzy
+msgid "&Create Directory..."
+msgstr "Guhanga ububiko"
+
+#: src/widgets/browser/actions.cpp:128
+#, fuzzy
+msgid "&Open file"
+msgstr "Gufungura Dosiye"
+
+#: src/widgets/browser/actions.cpp:129
+#, fuzzy
+msgid "&Verify..."
+msgstr "Gusuzuma:"
+
+#: src/widgets/browser/actions.cpp:133
+#, fuzzy
+msgid "&More Actions"
+msgstr "Amahitamo Arenze"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+#, fuzzy
+msgid "&Export Directory Listing..."
+msgstr "Hindura ububiko..."
+
+#: src/widgets/browser/actions.cpp:136
+#, fuzzy
+msgid "Show &Hidden Files && Directories"
+msgstr "Erekana amadosiye ahishwe n'ububiko"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Guhanga ububiko "
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Ibwirizwa Rishya"
+
+#: src/widgets/browser/actions.cpp:161
+#, fuzzy
+msgid "&Change Site"
+msgstr "Yobora ama site"
+
+#: src/widgets/browser/actions.cpp:162
+#, fuzzy
+msgid "&Quick Connect..."
+msgstr "Kwihuza..."
+
+#: src/widgets/browser/actions.cpp:163
+#, fuzzy
+msgid "&Connect To"
+msgstr "Impuza"
+
+#: src/widgets/browser/actions.cpp:164
+#, fuzzy
+msgid "&Disconnect"
+msgstr "Gucomora"
+
+#: src/widgets/browser/actions.cpp:179
+#, fuzzy
+msgid "Change Remote &Encoding"
+msgstr "Imisobekere y'Inyuguti"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+#, fuzzy
+msgid "Do you want to drop current connection?"
+msgstr "Kuri KIGEZWEHO Ukwihuza ? "
+
+#: src/widgets/browser/actions.cpp:326
+#, fuzzy
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Kuri iyi Idosiye ? "
+
+#: src/widgets/browser/actions.cpp:326
+#, fuzzy
+msgid "Shred File"
+msgstr "Idosiye "
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Gusiba Idosiye"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Gusimbuka"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Icyihutirwa"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Guhanga ububiko "
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Izina y'ububiko:"
+
+#: src/widgets/browser/actions.cpp:591
+#, fuzzy
+msgid "Send Raw Command"
+msgstr "Ibwirizwa Rishya"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Komandi:"
+
+#: src/widgets/browser/actions.cpp:648
+#, fuzzy
+msgid "Export Directory Listing"
+msgstr "Ububiko butonda Imiterere"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "Rusange"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+#, fuzzy
+msgid "Remote folder"
+msgstr "Ububiko... "
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Kitazwi"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Ubwoko:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Indanganturo:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Ingano:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Byakozwe"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "Impushya"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Impushya z'Ukugera"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "ishuri,urwego"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Kwerekana\n"
+"Ibyinjijwe"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Soma"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Kwandika\n"
+"Ibyinjijwe"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Kwandika"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Injiza"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Gukoresha "
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Bidasanzwe"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Ukoresha"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Itsinda"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Ibindi"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "kuboneza UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Kuboneza GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+#, fuzzy
+msgid "Sticky"
+msgstr "Gufatisha"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+#, fuzzy
+msgid "Root directory"
+msgstr "Ububiko "
+
+#: src/widgets/browser/view.cpp:143
+#, fuzzy
+msgid "Path: "
+msgstr "Inzira:"
+
+#: src/widgets/browser/view.cpp:392
+#, fuzzy
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr "ni A Bishunzwe: Ukwihuza . Impamyabushobozi: Ibisobanuro ni Bihari . "
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Muyunguruzi"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Guhanga ububiko "
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Irisiti Y'Amadosiye"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "Yobora ama site"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+#, fuzzy
+msgid "Unable to open file for writing."
+msgstr "Ntibishobotse gufungura idosiye''kugira wandike"
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+#, fuzzy
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p> i Idirishya Gumana: in i Sisitemu Agasanduku . <b> </b> Kuva: i <b> </b> "
+"Ibikubiyemo Kuri &Kuvamo i Porogaramu . </p> "
+"<p> "
+"<center> <img Inkomoko = \" \" > < /Hagati > </p> "
+
+#: src/mainwindow.cpp:234
+#, fuzzy
+msgid "Docking in System Tray"
+msgstr "in "
+
+#: src/mainwindow.cpp:242
+#, fuzzy, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"ni A . \n"
+"%n . "
+
+#: src/mainwindow.cpp:243
+#, fuzzy
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Urumva ushaka kuva muri"
+
+#: src/mainwindow.cpp:300
+#, fuzzy
+msgid "FTP Sites Near Me"
+msgstr "Izina ry'Urubuga"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr ""
+
+#: src/mainwindow.cpp:306
+#, fuzzy
+msgid "Edit Bookmarks..."
+msgstr "Guhindura Ibirango..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+#, fuzzy
+msgid "Download: %1/s"
+msgstr ": %1 /S "
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+#, fuzzy
+msgid "Upload: %1/s"
+msgstr ": %1 /S "
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Umurongo"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, fuzzy, no-c-format
+msgid "Failed Transfers"
+msgstr "Mucapirwaho"
+
+#: src/mainwindow.cpp:358
+#, fuzzy
+msgid "Sites Near Me"
+msgstr "Izina ry'Urubuga"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, fuzzy, no-c-format
+msgid "Threads"
+msgstr "Igikorwa"
+
+#: src/mainwindow.cpp:397
+#, fuzzy
+msgid "Traffic"
+msgstr "Icyarabu"
+
+#: src/kftpbookmarks.cpp:97
+#, fuzzy
+msgid "Copy of"
+msgstr "Bya "
+
+#: src/kftpbookmarks.cpp:307
+#, fuzzy
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Akamenyetso Idosiye ni Bishunzwe: . Injiza Urufunguzo ya: . "
+
+#: src/kftpbookmarks.cpp:326
+#, fuzzy
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt> Idosiye Byanze Na: Urufunguzo . Kuri <b> Guhindura </b> "
+"Ibimenyetso Na: ubusa Idosiye ? "
+"<br> "
+"<br> <font color=\"red\"> <b> : </b> Guhindura , Byose KIGEZWEHO Ibimenyetso . "
+"</font> </qt> "
+
+#: src/kftpbookmarks.cpp:327
+#, fuzzy
+msgid "Decryption Failed"
+msgstr "Gushiraho umutekano byanze"
+
+#: src/kftpbookmarks.cpp:328
+#, fuzzy
+msgid "&Overwrite Bookmarks"
+msgstr "Gusimbuza "
+
+#: src/kftpbookmarks.cpp:386
+#, fuzzy
+msgid "Enter key for bookmark file encryption."
+msgstr "Urufunguzo ya: Akamenyetso Idosiye Bishunzwe: . "
+
+#: src/kftpbookmarks.cpp:825
+#, fuzzy
+msgid "<No Services Published>"
+msgstr "Ama dosiye yose yatangajwe"
+
+#: src/kftpbookmarks.cpp:830
+#, fuzzy
+msgid "<DNSSD Not Available>"
+msgstr "<Ntibonetse>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Displa&y"
+msgstr "Kugaragaza"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "File &Browser"
+msgstr "Idosiye "
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Erekana amadosiye ahishwe n'ububiko"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "Show &directory tree"
+msgstr "Ububiko &Igiti "
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "in Bayite ( Mukomatanya ya: \" \" Imiterere ) "
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, fuzzy, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Nyirabyo na Itsinda ya: Idosiye "
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Ububiko &Igiti "
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Erekana ububiko"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, fuzzy, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Gushakisha & Gusimbura"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, fuzzy, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"iyi Ikiganiro , Guhindura: %s Bya Inkomoko /Ishyika: Inzira Bya i Yashizwe ku "
+"murongo . <b> . "
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, fuzzy, no-c-format
+msgid "Search What"
+msgstr "Umurongo ntambika w'ishakisha"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Aho bijya"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Inkomoko:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, fuzzy, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "ya: ku Seriveri: "
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, fuzzy, no-c-format
+msgid "Server Info"
+msgstr "Amakuru ya seriveri"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Izina rya seriveri:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Inturo:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Ijambobanga:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Izina- ukoresha:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Impagikiro:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Gusimbuza"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, fuzzy, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "kuvana hanze inyobora"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, fuzzy, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "1 : <b> </b> "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Ishusho"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, fuzzy, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Guhitamo i Kuzana Gucomeka: Kuva: i Urutonde munsi . Gucomeka: Kuzana Kuva: "
+"Rimwe Imiterere . "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, fuzzy, no-c-format
+msgid "Available import plugins:"
+msgstr "Kuzana Amacomeka : "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, fuzzy, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "2 : <b> Idosiye Kuri </b> "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, fuzzy, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Guhitamo i Akamenyetso Idosiye Kuva: nka Kuri Kuzana Ibimenyetso . A Mburabuzi "
+"Inzira: ku i Kuzana Gucomeka: . "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, fuzzy, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b> Inzira: : </b> "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "3 : <b> ... </b> "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Tegereza i Ibimenyetso cyavuye ahandi/cyatumijwe . "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, fuzzy, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b> Aho bigeze: : </b> "
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Imigaragarire"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, fuzzy, no-c-format
+msgid "Font && Colors"
+msgstr "Imyandikire & Amabara"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Imyandikire:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, fuzzy, no-c-format
+msgid "Client command color:"
+msgstr "command Ibara: : "
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, fuzzy, no-c-format
+msgid "Server response color:"
+msgstr "Ibara: : "
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, fuzzy, no-c-format
+msgid "Multiline response color:"
+msgstr "Ibara: : "
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, fuzzy, no-c-format
+msgid "Error message color:"
+msgstr "Ikosa &Ubutumwa Ibara: : "
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, fuzzy, no-c-format
+msgid "Status message color:"
+msgstr "&Ubutumwa Ibara: : "
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, fuzzy, no-c-format
+msgid "&Output"
+msgstr "Ibisohoka"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, fuzzy, no-c-format
+msgid "&File Output"
+msgstr "Idosiye "
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, fuzzy, no-c-format
+msgid "&Save log to file"
+msgstr "Kubika LOG Kuri Idosiye "
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, fuzzy, no-c-format
+msgid "Output file:"
+msgstr "Idosiye y'ibisohoka:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, fuzzy, no-c-format
+msgid "Source Server Info"
+msgstr "Amaseriveri yizewe gusa"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, fuzzy, no-c-format
+msgid "Destination Server Info"
+msgstr "Ububiko bw'Ishyika"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, fuzzy, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Urugero:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, fuzzy, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "Igaragaza Imiterere:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, fuzzy, no-c-format
+msgid "Transfer type:"
+msgstr "Ubwoko: : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, fuzzy, no-c-format
+msgid "Co&nnection"
+msgstr "Ukwihuza"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, fuzzy, no-c-format
+msgid "Active Connection IP"
+msgstr "Igenzura ActiveX"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, fuzzy, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "/Kuri Koresha "
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, fuzzy, no-c-format
+msgid "IP/hostname:"
+msgstr "/Izina ry'inturo: : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, fuzzy, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Umwinjirizo ntiwashizweho umutekano"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, fuzzy, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Koresha Kuva: i Umuyoboro: Urutonde "
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, fuzzy, no-c-format
+msgid "Minimum port:"
+msgstr "Umuyoboro: : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, fuzzy, no-c-format
+msgid "Maximum port:"
+msgstr "Umuyoboro: : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, fuzzy, no-c-format
+msgid "Timeouts"
+msgstr "Igihe cyarenze"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Ukwihuza Igihe cyarenze: ( in amasogonda ) : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr " Igihe cyarenze: ( in amasogonda ) : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, fuzzy, no-c-format
+msgid "Speed limit"
+msgstr "Impera yo hejuru"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Download (KB/s):"
+msgstr "( /S ) : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "Upload (KB/s):"
+msgstr "( /S ) : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Dis&k Space"
+msgstr "Umwanya kuri disiki"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Umwanya wa disiki wakoreshwa:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "NIBA ni OYA Kigenga Umwanya "
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Interval (sec):"
+msgstr "( Sec. ) : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Kigenga Umwanya ( ) : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Thre&ads"
+msgstr "Igikorwa"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Number of threads per session:"
+msgstr "Bya Igikorwa Umukoro : "
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Oya Byanze . "
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Ikindi"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, fuzzy, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "Idosiye ( Bya ) Ryari: \" & & \" "
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "ubusa ububiko bw'amaderese "
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, fuzzy, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Mbere "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "ftpSiteProperties"
+msgstr "Indangabintu ya lisiti"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, fuzzy, no-c-format
+msgid "Hostname:"
+msgstr "Izina ry'inturo:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, fuzzy, no-c-format
+msgid "Protocol:"
+msgstr "Porotokole"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, fuzzy, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "KURI /( ) "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, fuzzy, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "KURI /( Mburabuzi ) "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, fuzzy, no-c-format
+msgid "SFTP over SSH2"
+msgstr "KURI "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, fuzzy, no-c-format
+msgid "Site label:"
+msgstr "Akarango : "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, fuzzy, no-c-format
+msgid "Remote directory:"
+msgstr "Ububiko : "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, fuzzy, no-c-format
+msgid "Local directory:"
+msgstr "Ububiko bwo hafi:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, fuzzy, no-c-format
+msgid "&Anonymous login"
+msgstr "Ifashayinjira "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "Urwego rwo hejuru"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, fuzzy, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Koresha Bya Byongerewe... Ubwoko "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, fuzzy, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Koresha Bya Ubwoko "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, fuzzy, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "ya: Ububiko "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, fuzzy, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "ishakisha rinyuranye"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "OYA Koresha Igikubo Igikorwa ya: iyi &Ipaji "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, fuzzy, no-c-format
+msgid "Server Encoding"
+msgstr "Gushyiraho Isobeka"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Imisobekere:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, fuzzy, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Wongereugerageze Kuri Kwihuza ku "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Ongera ugerageze"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, fuzzy, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Bya ( 0 %S = Bidashira ) : "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, fuzzy, no-c-format
+msgid "Retry delay:"
+msgstr "Wongereugerageze Gutinda : "
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, fuzzy, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "Imigereka "
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, fuzzy, no-c-format
+msgid "Add Extension"
+msgstr "Umugereka"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, fuzzy, no-c-format
+msgid "Extension:"
+msgstr "Umugereka:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Umugereka"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Ukwihuza ... "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Ukwihuza ... "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, fuzzy, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "i URL: iyi Agasanduku "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, fuzzy, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Izina ry'inturo: "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, fuzzy, no-c-format
+msgid "Anon&ymous login"
+msgstr "Ifashayinjira "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, fuzzy, no-c-format
+msgid "Check for anonymous login"
+msgstr "ya: Bitazwi nyirabyo Ifashayinjira "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, fuzzy, no-c-format
+msgid "Enter account username"
+msgstr "Konti: Izina ry'ukoresha "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, fuzzy, no-c-format
+msgid "Enter account password"
+msgstr "Konti: Ijambobanga "
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, fuzzy, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Ongera ku bimenyetso"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Urwego rwo hejuru"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Ukwihuza kwanze."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "ya: Ububiko "
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, fuzzy, no-c-format
+msgid "X509 Certificate"
+msgstr "Kwimura Impamyabushobozi X509"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, fuzzy, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "i Impamyabushobozi: Ryari: Kwihuza... "
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Inzira:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, fuzzy, no-c-format
+msgid "E-mail &Address"
+msgstr "Aderesi ya Imeli"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, fuzzy, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "e - Ibaruwa Aderesi: Kuva: Igenzura Hagati "
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Imeli:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, fuzzy, no-c-format
+msgid "Startup and Exit"
+msgstr "na "
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, fuzzy, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Porogaramu &Kuvamo NIBA Gikora "
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, fuzzy, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Gutangira i Porogaramu Byagabanyijwe Kuri "
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, fuzzy, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Mugaragaza ku Gutangira "
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, fuzzy, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "i Agashushondanga "
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, fuzzy, no-c-format
+msgid "Site Defaults"
+msgstr "Shyiraho mburabuzi"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, fuzzy, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Akamenyetso Idosiye "
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, fuzzy, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Kuva: Ibimenyetso "
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, fuzzy, no-c-format
+msgid "&Notification"
+msgstr "Ikimenyetso"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Imipira"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Ryari: "
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, fuzzy, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Herekana %S Ryari: Umurongo ni ubusa Nyuma "
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, fuzzy, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Ryari: Ukwihuza Ongera ugerageze "
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, fuzzy, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Idosiye ya%S"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "ntacyo"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, fuzzy, no-c-format
+msgid "File list"
+msgstr "Irisiti Y'Amadosiye"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, fuzzy, no-c-format
+msgid "Unprocessed"
+msgstr "Birekuye"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Oke"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, fuzzy, no-c-format
+msgid "Not found"
+msgstr "Bitabonetse"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Byanze"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, fuzzy, no-c-format
+msgid "The size of the main window."
+msgstr "Ingano: Bya i Idirishya . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, fuzzy, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Ibirindiro: Bya i Idirishya ku i Mugaragaza . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, fuzzy, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Mburabuzi Ongera ugerageze IBARA ya: Gishya . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, fuzzy, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Mburabuzi Ongera ugerageze Gutinda ya: Gishya . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "A Ryari: Ibikorwa Byuzuye . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "A Ryari: Byose Yashizwe ku murongo Byarangiye . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, fuzzy, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr "A Ryari: A Ukwihuza Kuri i Seriveri: ni Nyuma . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, fuzzy, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "i Umukoresha Emeza &Kuvamo NIBA . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, fuzzy, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Imimerere Bya i Ibimenyetso Idosiye . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, fuzzy, no-c-format
+msgid "Default local directory."
+msgstr "Bya hafi Ububiko . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "i Porogaramu Yatangiye: Byagabanyijwe . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, fuzzy, no-c-format
+msgid "Should the application be started minimized."
+msgstr "i Porogaramu Yatangiye: Byagabanyijwe . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, fuzzy, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "i Mugaragaza Ryari: Itangira... i Porogaramu . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, fuzzy, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "i Agashushondanga . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, fuzzy, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "i Kuva: i Ibimenyetso . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, fuzzy, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr "A \" Emeza Gucomora \" Ikiganiro Igihe A Gucomora ni . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, fuzzy, no-c-format
+msgid "The default site encoding."
+msgstr "Mburabuzi &Ipaji Imisobekere: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, fuzzy, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr "A Urutonde Bya Idosiye Ubwoko Byakoreshejwe ya: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, fuzzy, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "ubusa ububiko bw'amaderese . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, fuzzy, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Imyandikire Byakoreshejwe ya: i LOG . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, fuzzy, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Ibara: Bya i Amabwiriza Yoherejwe: Kuri i Seriveri: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, fuzzy, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Ibara: Bya i Kuva: i Seriveri: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, fuzzy, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Ibara: Bya i Kuva: i Seriveri: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, fuzzy, no-c-format
+msgid "The color of the error messages."
+msgstr "Ibara: Bya i Ikosa Ubutumwa . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, fuzzy, no-c-format
+msgid "The color of the status messages."
+msgstr "Ibara: Bya i Imimerere Ubutumwa . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, fuzzy, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "i LOG Kuri A Idosiye Nka . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, fuzzy, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Idosiye Kuri i LOG . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, fuzzy, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr "A Umuyoboro: Kuva: A Byahiswemo ku Gikora . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, fuzzy, no-c-format
+msgid "The start of the portrange."
+msgstr "Tangira &vendorShortName; Bya i . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, fuzzy, no-c-format
+msgid "The end of the portrange."
+msgstr "Impera Bya i . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, fuzzy, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Ryari: Gikora . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, fuzzy, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "Kuri Yoherejwe: Ryari: i command . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, fuzzy, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr "i Yashizwe ku murongo Bya Yatangiye: Ryari: ikoresha Kurura na . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, fuzzy, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr "Kugenzura ya: Kigenga Umwanya na Kureka i Ryari: ni OYA Kigenga . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, fuzzy, no-c-format
+msgid "Interval for disk checking."
+msgstr "ya: Disiki%1 Kugenzura... . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, fuzzy, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Kigenga Umwanya ( in ) Bihari . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, fuzzy, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+"&Rusange MukusanyaKDE e - Ibaruwa Aderesi: ya: Bitazwi nyirabyo Amagambo banga "
+". "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, fuzzy, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+"e - Ibaruwa Aderesi: Byakoreshejwe ya: Bitazwi nyirabyo Amagambo banga . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, fuzzy, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Bya Igikorwa Kuri Koresha Ryari: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "i Umukoresha Emeza &Kuvamo NIBA . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, fuzzy, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "( in amasogonda ) ya: i Igenzura Ukwihuza . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, fuzzy, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "( in amasogonda ) ya: Ibyatanzwe . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, fuzzy, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Iyimura Umuvuduko ( KBayiti /S ) . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, fuzzy, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Gushyiraho Umuvuduko ( KBayiti /S ) . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, fuzzy, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "i Ububiko &Igiti ku Mburabuzi . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, fuzzy, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Birahishe Idosiye Ryari: Gushakisha . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, fuzzy, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr "i in Bayite in \" \" Ifishi %S: . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, fuzzy, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "i Nyirabyo na Itsinda ya: Idosiye . "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Ububiko &Igiti "
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Erekana ububiko"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, fuzzy, no-c-format
+msgid "Main Menu"
+msgstr "Ibikubiyemo by'Umwanya"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Umwanyabikoresho w'ibimenyetso"
+
+#, fuzzy
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Izina ry'ukoresha ya: ' %1 ' . "
+
+#, fuzzy
+#~ msgid "Error Connecting"
+#~ msgstr "Ikosa "
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Kugaragaza"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Amagenzura Yihuta"
+
+#, fuzzy
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Kuri Gushaka A Porogaramu Kuri Gufungura iyi Idosiye ! "
+
+#, fuzzy
+#~ msgid "Webpage design"
+#~ msgstr "Ihangagishusho "
+
+#~ msgid "Command"
+#~ msgstr "Icyo wifuza"
+
+#~ msgid "What's this?"
+#~ msgstr "Iki ni Iki?"
+
+#, fuzzy
+#~ msgid "Server Management"
+#~ msgstr "Izina rya seriveri:"
+
+#, fuzzy
+#~ msgid "Site Command Dialog"
+#~ msgstr "Guhindura ku Umurongo w'Ibwirizwa"
+
+#~ msgid "Username"
+#~ msgstr "Izina ry'ukoresha"
+
+#, fuzzy
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "A Izina ry'ukoresha Cyangwa Kanda Kureka "
+
+#, fuzzy
+#~ msgid "Group name"
+#~ msgstr "Izina ry'Itsinda:"
+
+#, fuzzy
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "A Itsinda Cyangwa Kanda Kureka "
+
+#, fuzzy
+#~ msgid "Description name"
+#~ msgstr "Isobanuramiterere( Izina)"
+
+#, fuzzy
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "A Umwirondoro: Cyangwa Kanda Kureka "
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Amagambobanga ntahura"
+
+#~ msgid "Optional"
+#~ msgstr "Bitari ngombwa"
+
+#, fuzzy
+#~ msgid "Password retype:"
+#~ msgstr "ijambobanga rihishwe"
+
+#, fuzzy
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Gutangiza Ibwiriza..."
+
+#, fuzzy
+#~ msgid "Display your idle time"
+#~ msgstr "Bigenda buhoro Igihe "
+
+#, fuzzy
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Bigenda buhoro - Igihe ( - Umukoro ) "
+
+#, fuzzy
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Bigenda buhoro - Igihe ( - Umukoro ) . <br> Bigenda buhoro - Igihe ( i Igiteranyo Bya Igihe kiri kuri interineti <br> ) . Bigenda buhoro - Igihe ni Sec. . <br> "
+
+#, fuzzy
+#~ msgid "This will change your password"
+#~ msgstr "Guhindura... Ijambobanga "
+
+#, fuzzy
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Guhindura... Ijambobanga . <br> 8 Inyuguti Birebire . "
+
+#, fuzzy
+#~ msgid "Display the group info"
+#~ msgstr "i Itsinda Ibisobanuro "
+
+#, fuzzy
+#~ msgid "Display the group info<br>"
+#~ msgstr "i Itsinda Ibisobanuro <br> "
+
+#, fuzzy
+#~ msgid "Show current aliases"
+#~ msgstr "KIGEZWEHO Irihimbano "
+
+#, fuzzy
+#~ msgid "Show current cdpaths"
+#~ msgstr "KIGEZWEHO "
+
+#, fuzzy
+#~ msgid "Show current glftpd version"
+#~ msgstr "KIGEZWEHO Verisiyo "
+
+#, fuzzy
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "KIGEZWEHO Verisiyo <br> "
+
+#, fuzzy
+#~ msgid "Display users currently online"
+#~ msgstr "Abakoresha kiri kuri interineti "
+
+#, fuzzy
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Abakoresha kiri kuri interineti <br> "
+
+#, fuzzy
+#~ msgid "Display the welcome screen"
+#~ msgstr "i Urakaza neza Mugaragaza "
+
+#, fuzzy
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "i Urakaza neza Mugaragaza <br> "
+
+#, fuzzy
+#~ msgid "Display current time on the site"
+#~ msgstr "KIGEZWEHO Igihe ku i &Ipaji "
+
+#, fuzzy
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "KIGEZWEHO Igihe ku i &Ipaji <br> "
+
+#, fuzzy
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "A Umukoresha , Gicurasi Na: &Ipaji "
+
+#, fuzzy
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "A Umukoresha , Gicurasi Na: &Ipaji <br> <br> <i> Urugero : </i> &Ipaji <br> <br> Kureka bigakora i Ibendera ( 6 ) ya: i Umukoresha ' . <br> Itondekanya Kuri Gusiba iyi Umukoresha Kuri A ' &Ipaji <br> "
+
+#, fuzzy
+#~ msgid "Change user's password"
+#~ msgstr "Ijambobanga "
+
+#, fuzzy
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Ijambobanga <br> <i> Urugero : </i> &Ipaji <br> Guhindura... i Ijambobanga Kuri ' ya: i <br> Umukoresha ' . <br> <br> \" &Ipaji \" ya: Birenzeho Ibisobanuro NIBA Kubona A ni OYA Gitekaanye: <br> Ikosa . <br> <br> * Icyo ari cyo cyose Ijambobanga , <i> Urugero : </i> &Ipaji * <br> Emera Kuri Ifashayinjira Na: Icyo ari cyo cyose Ijambobanga <br> <br> @ Icyo ari cyo cyose Imeli - nka Ijambobanga , <i> Urugero : </i> &Ipaji @ <br> Emera Kuri Ifashayinjira Na: A @ b . com OYA . com <br> "
+
+#, fuzzy
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "i Imimerere ya: i Itsinda "
+
+#, fuzzy
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "i Imimerere ya: i Itsinda <br> <b> : </b> A Umukoresha A mu buryo bwikora: Kubona <br> Ibendera 2 Kyongewe . A Umukoresha Kuri A Bya <br> Icyo ari cyo cyose Bya Amatsinda i Ibendera mu buryo bwikora: <br> Cyavanyweho . <br> "
+
+#, fuzzy
+#~ msgid "Display a user's flags"
+#~ msgstr "A Amabendera "
+
+#, fuzzy
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "A Amabendera <br> <br> <i> Urugero : </i> &Ipaji Amabendera <br> <br> Herekana %S Amabendera . <br> <br> <i> Urugero : </i> &Ipaji Amabendera <br> <br> Herekana %S Amabendera Bya Umukoresha . <br> "
+
+#, fuzzy
+#~ msgid "Kick a user off the site"
+#~ msgstr "A Umukoresha Bidakora i &Ipaji "
+
+#, fuzzy
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "A Umukoresha Bidakora i &Ipaji <br> <br> <i> Urugero : </i> &Ipaji <br> <br> &Kwica Byose Ukwihuza ya: i Umukoresha ' <br> "
+
+#, fuzzy
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Kyasibwe: %S Abakoresha , &Ipaji Akazi ya: . "
+
+#, fuzzy
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Kyasibwe: %S Abakoresha , &Ipaji Akazi ya: . <br> <br> <i> Urugero : </i> &Ipaji <br> Abakoresha i Ibendera . <br> <br> <i> Urugero : </i> &Ipaji <br> Gukuraho na i Bya Kyasibwe: %S Abakoresha ku &Ipaji <br> <br> A , Abakoresha Kuva: Itsinda ( ni , <br> NIBA Kuri iyi command in i Idosiye ) . <br> "
+
+#, fuzzy
+#~ msgid "Readd user"
+#~ msgstr "Umukoresha "
+
+#, fuzzy
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Umukoresha <br> <br> <i> Urugero : </i> &Ipaji <br> <br> Herekana %S A Urutonde Bya Abakoresha . <br> ( iyi Na: \" &Ipaji Abakoresha Kyasibwe: %S \" ) <br> <br> <i> Urugero : </i> &Ipaji <br> <br> Gukuraho i Ibendera ya: Umukoresha ' . <br> <br> <b> : </b> A Umukoresha Kuva: A Itsinda i Itsinda Bihari Siloti <br> Ibumoso: , ATARIIGIHARWE Ryari: A . <br> "
+
+#, fuzzy
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "A Gushyiraho /Iyimura Sitatisitiki "
+
+#, fuzzy
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "stats."
+
+#, fuzzy
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Abakoresha /Ibisobanuro Bigyanye A Umukoresha "
+
+#, fuzzy
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Abakoresha /Ibisobanuro Bigyanye A Umukoresha <br> <br> <i> Urugero : </i> &Ipaji Umukoresha <br> <br> Kugaragaza: A Urutonde Bya Byose Abakoresha ku &Ipaji . <br> <br> <i> Urugero : </i> &Ipaji Umukoresha <br> <br> Herekana %S Ibisobanuro: Bigyanye Umukoresha ' . <br> "
+
+#, fuzzy
+#~ msgid "Shows available groups"
+#~ msgstr "Bihari Amatsinda "
+
+#, fuzzy
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Ibisobanuro ku A Itsinda "
+
+#, fuzzy
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Ibisobanuro ku A Itsinda <br> <br> <i> Urugero : </i> &Ipaji FTP <br> <br> Herekana %S Ibisobanuro ku i Itsinda ' . <br> A Umukoresha ni Kyasibwe: %S , ku \" * * * * * * \" . <br> "
+
+#, fuzzy
+#~ msgid "Add a new group"
+#~ msgstr "A Gishya Itsinda "
+
+#, fuzzy
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "A Gishya Itsinda <br> <br> <i> Urugero : </i> &Ipaji Itsinda <br> <br> &Ongera i Itsinda ' Na: i Umwirondoro: ' . <br> "
+
+#, fuzzy
+#~ msgid "Delete a group"
+#~ msgstr "A Itsinda "
+
+#, fuzzy
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "A Itsinda <br> <br> <i> Urugero : </i> &Ipaji Itsinda <br> <br> Gusiba i Itsinda ' . <br> "
+
+#, fuzzy
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "KIGEZWEHO Amatsinda Cyangwa Ibibabi /A Itsinda "
+
+#, fuzzy
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "KIGEZWEHO Amatsinda Cyangwa Ibibabi /A Itsinda <br> A Itsinda i Nka A Ikintu Kuri i <br> command . Byose Amatsinda Mbere A Gishya Rimwe . <br> Abakoresha Na: i Ibendera Bikora Guhindura... By'umwihariko <br> Amatsinda ( &Ipaji ) . <br> <br> <i> Urugero : </i> &Ipaji Itsinda <br> <br> Kugaragaza: i Amatsinda in . <br> <br> <i> Urugero : </i> &Ipaji Itsinda FTP <br> <br> iyi /Itsinda ' . <br> "
+
+#, fuzzy
+#~ msgid "Change description for a group"
+#~ msgstr "Umwirondoro: ya: A Itsinda "
+
+#, fuzzy
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Umwirondoro: ya: A Itsinda <br> <br> <i> Urugero : </i> &Ipaji FTP <br> <br> Guhindura... i KIGEZWEHO Umwirondoro: ya: i Itsinda ' Kuri <br> ' . <br> "
+
+#, fuzzy
+#~ msgid "Display your current status line"
+#~ msgstr "KIGEZWEHO Imimerere Umurongo: "
+
+#, fuzzy
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Byose - Igihe "
+
+#, fuzzy
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Kwerekana amabara"
+
+#, fuzzy
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Byose - Igihe Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Byose - Igihe . <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Byose - Igihe "
+
+#, fuzzy
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Byose - Igihe Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Byose - Igihe . <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display daytop upload"
+#~ msgstr "Gushyiraho "
+
+#, fuzzy
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Gushyiraho . <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display daytop download"
+#~ msgstr "Iyimura "
+
+#, fuzzy
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Iyimura . <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display monthtop upload"
+#~ msgstr "Gushyiraho "
+
+#, fuzzy
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Gushyiraho . <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display monthtop download"
+#~ msgstr "Iyimura "
+
+#, fuzzy
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Iyimura . <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Byose - Igihe "
+
+#, fuzzy
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Igaragaza-fatamajwi ritagikora"
+
+#, fuzzy
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Byose - Igihe Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr ". <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Kwerekana amabara"
+
+#, fuzzy
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr ". <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Kwerekana amabara"
+
+#, fuzzy
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Kuri i Itsinda "
+
+#, fuzzy
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr ". <br> < Itsinda > ni Bitari ngombwa . Herekana %S Abakoresha <br> Kuri Itsinda , i Umukoresha Kuri Bidasanzwe <br> in . Kuri . ni ku i - <br> Igenamiterere . "
+
+#, fuzzy
+#~ msgid "Display server traffic"
+#~ msgstr "Seriveri: "
+
+#, fuzzy
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Seriveri: <br> Igiteranyo: %S /Iyimura ku Byose Abakoresha in Byose Ibyatoranyijwe "
+
+#, fuzzy
+#~ msgid "Display alltime group upload"
+#~ msgstr "Itsinda Gushyiraho "
+
+#, fuzzy
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Itsinda Gushyiraho <br> "
+
+#, fuzzy
+#~ msgid "Display month group upload"
+#~ msgstr "ukwezi: Itsinda Gushyiraho "
+
+#, fuzzy
+#~ msgid "Display month group upload<br>"
+#~ msgstr "ukwezi: Itsinda Gushyiraho <br> "
+
+#, fuzzy
+#~ msgid "Display month group download"
+#~ msgstr "ukwezi: Itsinda Iyimura "
+
+#, fuzzy
+#~ msgid "Display month group download<br>"
+#~ msgstr "ukwezi: Itsinda Iyimura <br> "
+
+#, fuzzy
+#~ msgid "Display weektop group upload"
+#~ msgstr "Itsinda Gushyiraho "
+
+#, fuzzy
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Itsinda Gushyiraho <br> "
+
+#, fuzzy
+#~ msgid "Display weektop group download"
+#~ msgstr "Itsinda Iyimura "
+
+#, fuzzy
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Itsinda Iyimura <br> "
+
+#, fuzzy
+#~ msgid "Display alltime group download"
+#~ msgstr "Itsinda Iyimura "
+
+#, fuzzy
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Itsinda Iyimura <br> "
+
+#, fuzzy
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Ububiko , Umukoresha . "
+
+#, fuzzy
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Ububiko , <br> Umukoresha ( , nka Home Ububiko Cyangwa ' &Ipaji <br> Kugaragaza: , OYA Guhindura... ) . - in Idosiye . <br> Byaremwe ya: Bidasanzwe Inyandikoporogaramu , Nka Umukoresha <br> Kuri Ijambobanga na Kwinjira in Nka Umukoresha . <br> Gushaka Oya Koresha ya: iyi . <br> <br> icyitonderwa : ni OYA , OYA Koresha iyi Kuri <br> . OYA Akazi ; Ibindi: Akazi . <br> Kuri ' ni Kuri LOG in Nka Umukoresha . <br> "
+
+#, fuzzy
+#~ msgid "Display helpscreen"
+#~ msgstr "Kugaragaza icyegeranyo"
+
+#, fuzzy
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Kugaragaza icyegeranyo"
+
+#, fuzzy
+#~ msgid "Display failed logins"
+#~ msgstr "Byanze "
+
+#, fuzzy
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Byanze <br> <br> ' //FTP - Ibyatanzwe //Ifashayinjira . <br> Ibisobanuro Bigyanye \" &Ipaji \" ya: . <br> "
+
+#, fuzzy
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Kugaragaza n'ibyabitswe byasibwe"
+
+#, fuzzy
+#~ msgid "Check when a user was last online"
+#~ msgstr "Ryari: A Umukoresha Iheruka kiri kuri interineti "
+
+#, fuzzy
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Ryari: A Umukoresha Iheruka kiri kuri interineti <br> <br> <i> Urugero : </i> &Ipaji <br> <br> Kugaragaza: i Iheruka Igihe in . <br> "
+
+#, fuzzy
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "i in Imiterere "
+
+#, fuzzy
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "i in Imiterere <br> "
+
+#, fuzzy
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Ibisobanuro: Bigyanye Abakoresha kiri kuri interineti "
+
+#, fuzzy
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Ibisobanuro: Bigyanye Abakoresha kiri kuri interineti <br> "
+
+#, fuzzy
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "Shaka ibimenyetso"
+
+#, fuzzy
+#~ msgid "<No contacts are available>"
+#~ msgstr "< Aho kubariza Bihari > "
+
+#, fuzzy
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "< in iyi Verisiyo Bya MukusanyaKDE > "
+
+#, fuzzy
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Urabyemeyekoko."
+
+#, fuzzy
+#~ msgid "Send Bookmarks"
+#~ msgstr "Shaka ibimenyetso"
+
+#, fuzzy
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Seriveri: ni A Dayimoni "
+
+#, fuzzy
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Kuri Gusiba iyi Idosiye ( S ) ? "
+
+#~ msgid "Date"
+#~ msgstr "Itariki"
+
+#~ msgid "Permissions"
+#~ msgstr "Uruhushya"
+
+#~ msgid "Owner"
+#~ msgstr "Nyirabyo"
+
+#, fuzzy
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Kuri Gufungura Ububiko ' %1 ' . "
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Ububiko ifite 1 Idosiye . \n"
+#~ "Ububiko ifite %n Idosiye . "
+
+#, fuzzy
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Byose Igihe . "
+
+#, fuzzy
+#~ msgid "Are you sure?"
+#~ msgstr "Ni byo koko"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Yoherejwe"
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Rusange"
+
+#, fuzzy
+#~ msgid "Add New Pattern"
+#~ msgstr "Kongeraho Umwanya Mushya"
+
+#, fuzzy
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Kuri Gukuraho iyi Ishusho ? "
+
+#~ msgid "&Other"
+#~ msgstr "&Ikindi"
+
+#, fuzzy
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Iyimura "
+
+#, fuzzy
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Igaragaza cyane"
+
+#, fuzzy
+#~ msgid "&Add Pattern..."
+#~ msgstr "Ongera ipaji ya webu..."
+
+#, fuzzy
+#~ msgid "E&dit..."
+#~ msgstr "Kwandika..."
+
+#, fuzzy
+#~ msgid "Re&move"
+#~ msgstr "Gukuraho"
+
+#, fuzzy
+#~ msgid "E&nabled"
+#~ msgstr "Bikora"
+
+#, fuzzy
+#~ msgid "Priorit&y List"
+#~ msgstr "Icyihutirwa"
+
+#, fuzzy
+#~ msgid "Priority pattern:"
+#~ msgstr "Ishusho : "
+
+#~ msgid "Patterns"
+#~ msgstr "Imitako"
+
+#, fuzzy
+#~ msgid "&Add Pattern"
+#~ msgstr "Ishusho:"
+
+#, fuzzy
+#~ msgid "&Low"
+#~ msgstr "hasi"
+
+#~ msgid "Value:"
+#~ msgstr "Agaciro:"
+
+#~ msgid "&Skip"
+#~ msgstr "Gusimbuka"
+
+#, fuzzy
+#~ msgid "&High"
+#~ msgstr "ejuru"
+
+#, fuzzy
+#~ msgid "Priority List Settings"
+#~ msgstr "Gucapa amagenamiterere y'ibikorwa"
+
+#, fuzzy
+#~ msgid "E&nable priority list"
+#~ msgstr "Icyihutirwa Urutonde "
+
+#, fuzzy
+#~ msgid "S&kip empty files"
+#~ msgstr "ubusa Idosiye "
+
+#, fuzzy
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Icyihutirwa Urutonde Kuri ububiko bw'amaderese "
+
+#, fuzzy
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "OYA Umurongo Idosiye ku Gusimbuka Urutonde "
+
+#, fuzzy
+#~ msgid "Queue dirs before files"
+#~ msgstr "Mbere Idosiye "
+
+#, fuzzy
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "A Urutonde Bya Idosiye Imitako Kuri Ryari: Gushakisha . "
+
+#, fuzzy
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "i Idosiye ku i Akayunguruzo: Urutonde . "
+
+#, fuzzy
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "i Idosiye ku i Gusimbuka Urutonde . "
+
+#, fuzzy
+#~ msgid "Should empty files be skipped."
+#~ msgstr "ubusa Idosiye . "
+
+#, fuzzy
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Gusimbuka Urutonde Kuri ububiko bw'amaderese Nka . "
+
+#, fuzzy
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Umurongo Idosiye ku Gusimbuka Urutonde . "
+
+#, fuzzy
+#~ msgid "Queue directories before files."
+#~ msgstr "ububiko bw'amaderese Mbere Idosiye . "
+
+#, fuzzy
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Byose Iyimura . "
+
+#, fuzzy
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "saa cyenda"
+
+#, fuzzy
+#~ msgid "&Set Filter..."
+#~ msgstr "Iyungurura mburabuzi..."
+
+#, fuzzy
+#~ msgid "Clear Filter"
+#~ msgstr "Guhanagura muyunguruzi"
+
+#~ msgid "Filter"
+#~ msgstr "Muyunguruzi"
+
+#, fuzzy
+#~ msgid "Enter filter:"
+#~ msgstr "Akayunguruzo: : "
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "Muhindura Kirango"
+
+#, fuzzy
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "Amagenamiterere ya HTML"
+
+#, fuzzy
+#~ msgid "Transfer mode:"
+#~ msgstr "Ubwoko : "
+
+#, fuzzy
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "- By'umwihariko ( na Agenga ) "
+
+#, fuzzy
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - Ibanga ( Agenga ) "
+
+#, fuzzy
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - ( Agenga ) "
+
+#, fuzzy
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "- Gusiba ( Oya ) "
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Konegisiyo ntikunze"
+
+#, fuzzy
+#~ msgid "Transfer:"
+#~ msgstr "Yoherejwe"
+
+#, fuzzy
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr ": %1 /S : %1 /S "
+
+#, fuzzy
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "Ububiko ... "
+
+#, fuzzy
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "Byahinduwe Kuri ' %1 ' "
+
+#, fuzzy
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Na: ' %1 ' Idosiye Iyimura "
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr ""
+#~ "1 Bayite . \n"
+#~ "%n Bayite . "
+
+#, fuzzy
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Na: ' %1 ' Idosiye Gushyiraho "
+
+#, fuzzy
+#~ msgid "FXP transfer failed."
+#~ msgstr "Byanze . "
+
+#, fuzzy
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Ubwoko Imikorere Byanze , Kuri Ukwihuza . "
+
+#, fuzzy
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Ubuturo butazwi %1"
+
+#, fuzzy
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Kuri Mburabuzi Ukwihuza . "
+
+#, fuzzy
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Mburabuzi Ukwihuza . "
+
+#, fuzzy
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "Ubwoko Byanze Kabiri Times , Koresha Bya ! "
+
+#, fuzzy
+#~ msgid "Directory listing complete."
+#~ msgstr "Byuzuye . "
+
+#, fuzzy
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Kuri Kwihuza Kuri i Seriveri: . "
+
+#, fuzzy
+#~ msgid "Disconnected from server."
+#~ msgstr "Kuva: Seriveri: . "
+
+#, fuzzy
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "ku Inkomoko na Ishyika: Seriveri: . "
+
+#, fuzzy
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "A i Ibyatanzwe Ukwihuza . "
+
+#~ msgid "Error reading file."
+#~ msgstr "Habaye ikibazo mu gusoma idosiye."
+
+#, fuzzy
+#~ msgid "Unable to connect with server."
+#~ msgstr "Kuri Kwihuza Na: Seriveri: . "
+
+#, fuzzy
+#~ msgid "Directory is not in cache."
+#~ msgstr "ni OYA in Ubwihisho . "
+
+#, fuzzy
+#~ msgid "Unable to open directory."
+#~ msgstr "Kuri Gufungura Ububiko . "
+
+#, fuzzy
+#~ msgid "View &Local"
+#~ msgstr "&Indangahantu"
+
+#, fuzzy
+#~ msgid "&Offline Mode"
+#~ msgstr "Ntibicometse kuri interineti"
+
+#, fuzzy
+#~ msgid "This URL is not in the cache."
+#~ msgstr "ni OYA in i Ubwihisho . "
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "ni OYA in Ubwihisho . "
+
+#, fuzzy
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr " Igihe cyarenze: ( in amasogonda ) : "
+
+#, fuzzy
+#~ msgid "Should the cache be used when browsing the sites."
+#~ msgstr "i Ubwihisho Byakoreshejwe Ryari: Gushakisha i . "
+
+#, fuzzy
+#~ msgid "Error to find %1 file"
+#~ msgstr "Habaye ikibazo mu gusoma idosiye."
+
+#~ msgid "Preferences"
+#~ msgstr "Ibyahisemo"
+
+#~ msgid "User name"
+#~ msgstr "Izina-nkoresha"
+
+#~ msgid "Add to bookmarks"
+#~ msgstr "Ongera ku bimenyetso"
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/kftpgrabber.po b/translations/sk/messages/kftpgrabber.po
new file mode 100644
index 0000000..8ec21b0
--- /dev/null
+++ b/translations/sk/messages/kftpgrabber.po
@@ -0,0 +1,2883 @@
+# translation of kftpgrabber.po to Slovak
+#
+# Richard Fric <Richard.Fric@kdemail.net>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-09-15 18:37+0200\n"
+"Last-Translator: Richard Fric <Richard.Fric@kdemail.net>\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"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr ""
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr ""
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr ""
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr ""
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr ""
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr ""
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr ""
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr ""
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr ""
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr ""
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr ""
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr ""
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr ""
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr ""
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr ""
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr ""
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr ""
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr ""
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr ""
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr ""
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr ""
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr ""
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr ""
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr ""
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr ""
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr ""
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr ""
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr ""
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr ""
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr ""
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr ""
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr ""
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr ""
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr ""
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr ""
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr ""
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr ""
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr ""
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr ""
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr ""
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr ""
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr ""
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr ""
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr ""
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr ""
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr ""
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr ""
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr ""
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr ""
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr ""
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr ""
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr ""
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr ""
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr ""
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr ""
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr ""
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr ""
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr ""
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr ""
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr ""
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr ""
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr ""
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr ""
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr ""
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr ""
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr ""
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr ""
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr ""
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr ""
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr ""
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr ""
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr ""
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr ""
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr ""
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr ""
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr ""
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr ""
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr ""
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr ""
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr ""
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr ""
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr ""
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/kftpgrabber.po b/translations/sr/messages/kftpgrabber.po
new file mode 100644
index 0000000..ec85610
--- /dev/null
+++ b/translations/sr/messages/kftpgrabber.po
@@ -0,0 +1,3652 @@
+# translation of kftpgrabber.po to Serbian
+# Slobodan Simic <simicsl@verat.net>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2005-11-14 10:45+0100\n"
+"Last-Translator: Slobodan Simic <simicsl@verat.net>\n"
+"Language-Team: Serbian <kde-yu@kde.org.yu>\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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "повезујем се"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Директоријум"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Приоритет"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Преузми"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Пошаљи"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Име фајла"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Величина"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "П&ромени сајт"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Одредиште"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP увоз"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber увоз"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp увоз"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Сви планирани преноси су завршени."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Фајл постоји"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - FTP клијент за KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Главни програмер"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Програмер"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH код"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc код"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Код за искачући Kopete балон"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Контрола графикона саобраћаја"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Дизајн иконе"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Тестирање и отклањање грешака"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Име директоријума:"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Преноси следећих фајлова су завршени:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "Веза са „%1“ није успела."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "Пренос фајла није успео."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Изворни фајл се не може наћи."
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Дозволе"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Не могу да отворим фајл ради уписа."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Пренос следећих фајлова <b>је прекинут</b> јер није остало довољно слободног "
+"простора на „%1“:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Не могу да успоставим SSH везу (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Пријављујем се..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Пријава није успела."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Не могу да иницијализујем SFTP канал."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Не могу да иницијализујем SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "искључен"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Повезујем се..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Повезујем се на „%1:%2“..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Прекини"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "Добављам листу директоријума..."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Добављам листу директоријума..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Преносим..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Уклањам директоријуме..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Преименуј"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Веза са „%1“ није успела."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Не могу да се повежем."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Поново покушавам везивање (%1/%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Не могу да успоставим TLS везу."
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Чекам на везу..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Веза успостављена."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "FXP пренос завршен."
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Прегледам директоријуме..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Преносим..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "искључен"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Веза са „%1“ није успела."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Неупослен."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Провера завршена!"
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Добављам листу директоријума..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Чекам %1 секунди пре поновног повезивања..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Преименуј"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Поново покушавам везивање..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Поново покушавам везивање..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Поновни покушај прекинут."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Радње ако фајл постоји (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Величина/Временски печат"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Исти"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Старији"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Новији"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Мањи"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Већи"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Прескочи"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Пребриши"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Настави"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Преименуј"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Питај"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Дневник (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Локална сесија"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Дневник"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Веза са %1 је успешно успостављена."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Дајте вашу лозинку личног кључа дешифровања."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Сесија"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Бар једна сесија мора остати отворена на свакој страни."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Завршите све преносе пре затварања сесије."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Ова сесија је тренутно повезана. Сигурни сте да желите да се искључите?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Затвори сесију"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Брзо &повезивање..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Нова сесија"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Лева страна"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Десна страна"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&Режим преноса (Аутоматски)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Бинарно"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Аутоматски"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&Режим преноса (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&Режим преноса (Бинарно)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Изабери..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Нема име"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Пренос"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Опис"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Нема неуспелих преноса."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "Поново пок&рени пренос"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "Дод&ај у ред"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Додај све у ред"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Уклони"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Уклони све"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Сигурни сте да желите да уклоните овај неуспели пренос?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Сигурни сте да желите да уклоните СВЕ неуспеле преносе?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Облик1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Нова шема"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Шема имена фајла:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Боја:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Брзо повезивање"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "име домаћина"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "исправан порт"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "корисничко име"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "лозинка"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " и"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Унесите "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Дајте вашу лозинку X509 сертификата дешифровања."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Сајтови близу вас"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Нема познатих сајтова."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Шема"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Боја"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Додај шему"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Укључено"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Истицање"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Још није убачено.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Листа прескакања"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII екстензије"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Опште"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Преноси"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Приказ"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Радње"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Филтери"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Провера контролне суме"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Контролна сума"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Провера завршена!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Не могу да отворим фајл контролне суме или фајл има неисправан формат!"
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Име фајла"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Филтери"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Преузми"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Преименуј"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Новији"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Преименуј"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "&Веза"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Тражи и замени"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Коришћење опсега"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "застој"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "ради"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Чекам на везу..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Филтер: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Име"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Извор"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Одредиште"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Напредак"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Брзина"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Немате ниједан фајл на редоследу."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Преузми"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Нити"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Покрени пренос"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "П&рекини пренос"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Уклони &све"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Помери &горе"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Помери &доле"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Помери &горе"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Измени инфо преноса"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Учитај редослед из фајла"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Сними редослед у фајл"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "По&крени"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Паузирај"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Дод&ај пренос..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Тражи и замени..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Прикажи &филтер"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Сајт"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Сигурни сте да желите да уклоните фајл(ове) из редоследа?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Сигурни сте да желите да уклоните СВЕ фајлове из редоследа?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Учитавање новог редоследа пребрисаће стари; сигурни сте да желите да наставите?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Учитај редослед"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Сесија сајта [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Нит %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "неупослен"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "искључен"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "повезујем се"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "преносим"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Стање"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Нема тренутно активних нити."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Нема маркера."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Нови..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "П&реименуј"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Направи подкатегорију..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Дуплирај"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Сајт"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Име категорије"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Преименуј категорију:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Име нове категорије"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Нова категорија:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Нови сервер"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Нови сервер"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Сигурни сте да желите да уклоните ову категорију?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Сигурни сте да желите да уклоните овај сервер?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Не могу да учитам изабрани прикључак увоза."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Означени фајл не постоји или је нечитљив."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Извоз маркера је завршен."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "Ур&еди..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS Поставке"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Увези..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Извези..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Уређивач FTP маркера"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Хоћете да извезете ваше маркере KFTPGrabber-а. Они могу садржати лозинке "
+"или осетљиве X509 сертификате: извозом ваших маркера можете угрозити њихову "
+"безбедност."
+"<br>"
+"<br>Да ли сте сигурни?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Извези маркере"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Прекини"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Прикажи као стабло"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Својства"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "И&сецкај"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Филтери"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "Листа приоритета фајлова при стављању у ред."
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Пренос"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Пренос у &ред"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Направи директоријум..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Отвори фајл"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "Про&вери..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Још радњи"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Извези листу директоријума..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Прикажи &скривене фајлове и директоријуме"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Направи директоријум"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Пошаљи сирову наредбу"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "П&ромени сајт"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Брзо повезивање..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Повежи се са"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Прекини везу"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Промени удаљ&ено кодирање"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Да ли хоћете да прекинете тренутну везу?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Сигурни сте да желите да ИСЕЦКАТЕ овај фајл?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Исецкај фајл"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Обриши фајл"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Прескочи"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Приоритет"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Направи директоријум"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Име директоријума:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Пошаљи сирову наредбу"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Наредба:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Извези листу директоријума"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Опште"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Удаљена фасцикла"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Непознат"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Врста:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Локација:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Величина:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Направљен:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Дозволе"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Дозволе приступа"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Класа"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Приказ\n"
+"ставки"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Читање"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Упис\n"
+"ставки"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Упис"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Уђи"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Изврши"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Специјално"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Корисник"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Група"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Остали"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Подеси UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Подеси GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Лепљив"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Корени директоријум"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Путања: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Ово је SSH шифрована веза. Подаци о сертификату тренутно нису доступни."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Филтери"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Направи директоријум"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Листа фајлова"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "П&ромени сајт"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> бележник иницијализован.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Не могу да отворим фајл ради уписа."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Не могу да нађем %1 XML описни фајл графичког окружења. Проверите да ли сте "
+"исправно инсталирали програм! Ако имате неких питања, питајте на %2."
+"<br>"
+"<br><b>Упозорење:</b> Тренутно графичко окружење ће бити непотпуно!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Затварањем главног прозора KFTPGrabber ће остати да ради у системској "
+"касети. Користите <b>Заврши</b> из менија <b>KFTPGrabber-а</b> "
+"да бисте изашли из програма.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Пристајем у системску касету"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Тренутно је у току %n пренос.\n"
+"Тренутно су у току %n преноса.\n"
+"Тренутно је у току %n преноса."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Сигурни сте да желите да завршите?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP сајтови близу мене"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Сајтови у KWallet-у"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Уреди маркере..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Преузимање: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Слање: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Редослед"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Неуспели преноси"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Сајтови близу мене"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Нити"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Саобраћај"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Копија"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Овај фајл са маркерима је шифрован. Унесите кључ за дешифровање."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Дешифровање фајла маркера са датим кључем није успело. Желите ли да <b>"
+"пребришете</b> маркере са празним фајлом?"
+"<br>"
+"<br><font color=\"red\"><b>Упозорење:</b> Ако пребришете, сви тренутни маркери "
+"биће изгубљени.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Дешифровање није успело"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Пребриши маркере"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Унесите кључ за дешифровање фајла са маркерима."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Нема објављених услуга>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD није доступан>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Нема сајтова у KWallet-у>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Слободан Симић"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "simicsl@verat.net"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "П&риказ"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Прегледач фајлова"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Прикажи &скривене фајлове и директоријуме"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Прикажи стабло &директоријума"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "Прикажи ве&личину у бајтовима (мења „људима читљив“ формат)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Прикажи &власника и групу за сваки фајл"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Прикажи стабло &директоријума"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Прикажи &филтер"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Тражење и мењање редоследа"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Помоћу овог дијалога можете направити масовне замене путања одредишта/извора за "
+"преносе у редоследу. <b>Измене се не могу оповргнути.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Тражи шта"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Одредиште:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Извор:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Тражи само преносе на одређеном серверу"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Инфо сервера"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Име сервера:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Домаћин:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Лозинка:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Корисничко име:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Порт:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Замени са"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Чаробњак увоза маркера"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Корак 1: <b>Изаберите прикључак увоза</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Слика"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Изаберите одговарајући прикључак са листе испод. Сваки прикључак може увозити "
+"из једног одређеног формата."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Доступни прикључци увоза:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Корак 2: <b>Изаберите фајл маркера за увоз</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Изаберите фајл маркера из ког желите да увезете ваше маркере. Подразумевана "
+"путања је већ одређена на основу прикључка увоза."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Путања маркера:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Корак 3: <b>Увоз маркера...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Сачекајте док се маркери увозе."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Напредак увоза:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Изглед"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Фонт и боје"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Фонт:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Боја наредби клијента:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Боја одговора сервера:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Боја вишелинијског одговора:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Боја порука грешке:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Боја порука стања:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Излаз"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Излаз &фајла"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Сними дневник у фајл"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Излазни фајл:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Инфо изворног сервера"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Инфо одредишног сервера"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Извор:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Одредиште:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Врста преноса:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "&Веза"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP активне везе"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Принуди PORT/EPRT да &користи подешени IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/Име домаћина:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Опсег портова активне везе"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Користи &само портове из наведеног опсега"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Најмањи порт:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Највећи порт:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Времена истицања"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Време истицања контроле везе (у секундама):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Време истицања преноса података (у секундама):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Ограничење брзине"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Преузимање (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Слање (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Простор на дис&ку"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Провера слободног простора диска"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Заустави пренос ако &нема довољно простора"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Размак (s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Најмање слободног простора (Mb):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Л&анци"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Број ланаца по сесији:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Нема неуспелих преноса."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Остало"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "Стави у &ред фајлове (уместо преноса) када се „превуче-и-пусти“"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Прескочи празне директ&оријуме"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Потврди искључење &пре искључивања"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "Својства ftp сајта"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Име домаћина:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Протокол:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP преко TLS/SSL (изричито)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP преко TLS/SSL (узрочно)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP преко SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Ознака сајта:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Удаљени директоријум:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Локални директоријум:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Анонимно пријављивање"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "Н&апредно"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "&Искључи употребу додатног пасивног режима"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Искључи употребу пасивног режима"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Користи STAT за листе директоријума"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Ланци вишеструких преноса"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Не користи вишеструке ланце за овај сајт"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Кодовање сервера"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Кодовање:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Поно&во покушај повезивање при грешци"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Покушај поново"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Број поновних покушаја (0 = неограничено):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Размак покушаја:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII &наставци"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Додај наставак"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Наставак:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Наставак"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Поново покушавам везивање..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Поново покушавам везивање..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Унесите цео URL унутар овог поља"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Унесите име ftp домаћина"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Анон&имно пријављивање"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Провери анонимне пријаве"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Унесите корисничко име налога"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Унесите лозинку налога"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Додај у &маркере"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Напредно"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Веза успостављена."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Користи STAT за листе директоријума"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 сертификат"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Користи следећи SSL сертификат при повезивању"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Путања:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "Е-&адреса"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Користи е-адресу из контролног центра"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "Е-адреса:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Покретање и завршавање"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Потврди &излаз ако има активних преноса"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Покрени програм миними&зиран у касети"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Прикажи &уводни екран при покретању"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Прикажи икону у ка&сети"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Подразумевано на сајту"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Ши&фруј фајл са маркерима"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, fuzzy, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Прикажи сајтове из KWallet-а у &маркерима"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Обавештења"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Облачићи"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Прикажи о&блачић кад се пренос заврши"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Прикажи само ако нема више &планираних преноса"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Прикажи облачић када &успе поновно везивање"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Фајл:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "ниједан"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Листа фајлова"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Необрађен"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "У реду"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Није нађен"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Неуспешан"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Величина главног прозора."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Позиција главног прозора на екрану."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Подразумевани број поновних покушаја за нове сајтове."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Подразумевани размак између покушаја за нове сајтове."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Да ли ће се приказивати облачић када се нека радња заврши."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Да ли ће се приказивати облачић када су сви преноси из редоследа завршени."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Да ли ће се приказивати облачић када се, након поновног покушаја, веза са "
+"сервером успешно успостави."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Треба ли корисник да потврди излаз ако су у преноси у току."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Статус шифровања фајла са маркерима."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Подразумевани локални директоријум."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Да ли ће се програм покретати као минимизиран."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Да ли ће се програм покретати као минимизиран."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Да ли се уводни екран приказује при покретању програма."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Да ли се приказује икона у системској касети."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Да ли се сајтови из KWallet-а требају приказивати у маркерима."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Да ли се дијалог „потврди искључивање“ треба приказивати сваки пут када се "
+"затражи искључење."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Подразумевано кодирање сајта."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr "Листа шема фајлова где се ASCII режим користи за пренос."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Да ли се прескачу празни директоријуми."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Фонт који треба користити за дневник."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Боја наредби које се шаљу серверу."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Боја одговора са сервера."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Боја вишелинијских одговора сервера."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Боја порука грешке."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Боја статусних порука."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Да ли дневник треба да се уписује и у фајл."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Фајл у који ће се уписивати дневник."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr "Да ли ће порт из наведеног опсега бити изабран при активним преносима."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Почетак опсега портова."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Крај опсега портова."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Да ли ће IP бити прегажен када се раде активни преноси."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "IP који ће се слати када се прегази PORT наредба."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Да ли ће се преноси стављати у ред уместо да се покрену, када се користи "
+"превуци-и-пусти."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Да ли ће kftpgrabber проверавати слободан простор и прекинути пренос ако га "
+"нема довољно."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Размак провера диска."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Најмање слободног простора (у MB) који мора бити доступан."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Користи глобалну е-адресу KDE-а за лозинку анонимуса."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "Е-адреса која би требало да се користи за лозинку анонимуса."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Број ланаца који се користи при преносу."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Треба ли корисник да потврди излаз ако су у преноси у току."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Време истека (у секундама) за контролу везе."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Време истека (у секундама) за преносе података."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Ограничење брзине укупног преузимања (kb/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Ограничење брзине укупног слања (kb/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Да ли се подразумева да се приказује и стабло директоријума."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Да ли ће се при прегледању приказивати скривени фајлови."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Да ли ће се величина фајла приказивати у бајтовима а не у „људима читљивој“ "
+"форми."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Да ли ће власник и група бити приказивани за сваки фајл."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Прикажи стабло &директоријума"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Прикажи &филтер"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Главни мени"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Трака са маркерима"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Није наведено корисничко име за „%1“."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Грешка при повезивању"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Приказ"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Брзо повезивање"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Не могу да нађем програм за отварање овог фајла!"
+
+#~ msgid "Webpage design"
+#~ msgstr "Дизајн веб странице"
+
+#~ msgid "Command"
+#~ msgstr "Наредба"
+
+#~ msgid "What's this?"
+#~ msgstr "Шта је ово?"
+
+#~ msgid "Server Management"
+#~ msgstr "Управљање серверима"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Преузето: %1 MB Послато: %2 MB<br>Кредити: %3 MB Однос: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Дијалог наредби сајта"
+
+#~ msgid "Username"
+#~ msgstr "Корисничко име"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Унесите корисничко име или притисните откажи"
+
+#~ msgid "Group name"
+#~ msgstr "Име групе"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Унесите групу или притисните откажи"
+
+#~ msgid "Description name"
+#~ msgstr "Име описа"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Унесите опис или притисните откажи"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Лозинке се не поклапају"
+
+#~ msgid "Optional"
+#~ msgstr "Опционо"
+
+#~ msgid "Password retype:"
+#~ msgstr "Лозинка поново:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Пошаљи си&рову наредбу..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Приказује ваше време мировања"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Поставите ваше време мировања (по сесији)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Поставите ваше време мировања (по сесији).<br>Овде се одређује ваше време мировања (време које можете бити <br>повезани а да се ништа не ради). Највеће време мировања је 7200 секунди.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Ово ће изменити вашу лозинку"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Ово ће изменити вашу лозинку.<br>Лозинка може бити највише 8 знакова дугачка."
+
+#~ msgid "Display the group info"
+#~ msgstr "Прикажи податке групе"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Приказује податке о групи<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Прикажи тренутне алијасе"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Прикажи тренутни cdpaths"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Прикажи тренутну glftpd верзију"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Приказује тренутну glftpd верзију<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Прикажи кориснике тренутно на вези"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Приказује кориснике који су тренутно на вези<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Прикажи екран добродошлице"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Приказује екран добродошлице<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Прикажи тренутно време на сајту"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Приказује које је тренутно време на сајту<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Прикажи недавно повраћена издања"
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Приказује недавно повраћена издања<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Обриши корисника, може бити враћен са site READD"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Брише корисника који може бити враћен са site READD<br><br><i>Пример:</i> site deluser Arhimed<br><br>Ово ће активирати заставицу DELETED (6) за корисника „Arhimed“.<br>Да бисте у потпуности обрисали овог корисника морате да урадите „site purge“<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Измени лозинку корисника"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Мења лозинку корисника<br><i>Пример:</i> site chpass Arhimed новалозинка<br>Ово ће променити лозинку у „новалозинка“ за<br>корисника „Arhimed“.<br><br>Види „site passwd“ за више информација ако добијате грешку<br>да лозинка није довољно сигурна.<br><br>* Означава било коју лозинку, <i>Пример:</i> site chpass arch *<br>Ово ће омогућити да се arch пријави са било којом лозинком<br><br>@ Означава лозику као е-адресу, <i>Пример:</i> site chpass arch @<br>Ово ће омогућити да се arch пријави са a@b.com али не и ab.com<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Мењај gadmin стање корисника за дату групу"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Мења gadmin стање корисника за дату групу<br><b>Напомена:</b> Када корисник постане gadmin аутоматски ће му се<br>додати заставица 2. Када корисник престане да буде gadmin било<br>које од група gadmin заставица ће се аутоматски<br>уклонити.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Прикажи заставице корисника"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Приказује заставице корисника<br><br><i>Пример:</i> site flags<br><br>Ово ће приказати ваше заставице.<br><br><i>Пример:</i> site flags Arhimed<br><br>Ово ће приказати заставице корисника Arhimed.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Избаци корисника са сајта"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Избацује корисника са сајта<br><br><i>Пример:</i> site kick Arhimed<br><br>Ово ће прекинути све везе корисника „Arhimed“<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Уклони обрисане кориснике, site READD за очишћене кориснике НЕЋЕ радити."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Уклања обрисане кориснике, site READD неће радити за очишћене кориснике.<br><br><i>Пример:</i> site purge<br>Ово ће УКЛОНИТИ СВЕ кориснике који имају заставицу DELETED.<br><br><i>Пример:</i> site purge zika<br>Ово ће уклонити само корисника zika а остатак обрисаних корисника оставити на сајту<br><br>Ако сте ви gadmin, можете очистити само кориснике из ваше групе (то јест,<br>ако вам је дат приступ овој наредби у фајлу подешавања).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Поново додај корисника"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Поново додај корисника<br><br><i>Пример:</i> site readd<br><br>Ово ће приказати листу корисника који се могу поново додати.<br>(Ово можете постићи и са „site users deleted“)<br><br><i>Пример:</i> site readd Arhimed<br><br>Ово ће уклонити заставицу DELETED за корисника „Arhimed“.<br><br><b>Напомена:</b> Када поново додајете корисника одређене групе, група мора имати слободно место, <br>чак иако сте ви оператор сајта.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Прикажи статистику слања/преузимања корисника"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Прикажи статистику слања/преузимања корисника<br><br>Дефинише се у „/ftp-data/text/user.stats“<br><br>Ако имете вишеструке одељке онда ће ово приказати<br>статистику свих одељака. (Али морате ископирато овај фајл у<br>SECTIONuser.stats. нпр: ако имате одељак GAMES онда ће glftpd<br>тражити фајлове user.stats и GAMESuser.stats у /ftp-data/text.<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Листај кориснике / Прикажи детаље о кориснику"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Листај кориснике / Прикажи детаље о кориснику<br><br><i>Пример:</i> site user<br><br>Приказује листу корисника који су тренутно на сајту.<br><br><i>Пример:</i> site user Arhimed<br><br>Ово ће приказати детаљне податке о кориснику „Arhimed“.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Прикажи доступне групе"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Прикажи детаљне податке о групи"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Приказује детаљне податке о групи<br><br><i>Пример:</i> site ginfo ftp<br><br>Ово ће приказати детаљне податке о групи „ftp“.<br>Ако је корисник обрисан, његов наслов ће бити замењен са „***DELETED***“.<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Додај нову групу"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Додаје нову групу<br><br><i>Пример:</i> site grpadd група нова_група<br><br>Ово ће додати нову групу „група“ са описом „нова_група“.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Обриши групу"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Брише групу<br><br><i>Пример:</i> site grpdel група<br><br>Ово ће избрисати групу „група“.<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Приказује вашу тренутну групу или врши придруживање/напуштање групе"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Приказује вашу тренутну групу или врши придруживање/напуштање групе<br>Да бисте се придружили групи додајте име групе као параметар<br>наредби. Морате напустити све групе пре прикључивања новој.<br>Само корисници са заставицом siteop могу мењати личне<br>групе (види site CHGRP).<br><br><i>Пример:</i> site group<br><br>Ово ће приказати групу у којој се налазите.<br><br><i>Пример:</i> site group ftp<br><br>Са овим ћете напустити или се придружити групи „ftp“.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Мења опис групе"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Мења опис групе<br><br><i>Пример:</i> site grpnfo ftp нови_опис<br><br>Ово ће променити тренутни опис групе „ftp“ у<br>„нови_опис“.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Приказује вашу тренутну линију стања"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Прикажи све преузимаче"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Приказује све преузимаче"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Прикажи све преузимаче који су у групи"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Приказује све преузимаче.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Прикажи све пошиљаоце"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Прикажи све пошиљаоце који су у групи"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи све пошиљаоце.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Прикажи слања данас"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Прикажи данашње пошиљаоце који су у групи"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи данашња слања.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Прикажи преузимање данас"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Прикажи данашње преузимаче који су у групи"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи данашња преузимања.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Прикажи слање последњег месеца"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Прикажи пошиљаоце последњег месеца који су у групи"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи слање последњег месеца.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Прикажи преузимање последњег месеца"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Прикажи преузимаче последњег месеца који су у групи"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи преузимање последњег месеца.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Прикажи највише уништаване"
+
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Приказује највише уништаване"
+
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Прикажи највише уништаване који су у групи"
+
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи највише уништаване.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Прикажи пошиљаоце последње недеље"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Прикажи пошиљаоце последње недеље који су у групи"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи пошиљаоце последње недеље.<br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Прикажи преузимаче последње недеље"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Прикажи преузимаче последње недеље који су у групи"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Прикажи преузимаче последње недеље. <br>Параметар <group> није неопходан. Ако га наведете<br>приказаће се само корисници који су у тој групи, али корисник <br>који ово ради мора имати посебан приступ у glftpd.conf.<br>Ово се контролише са подешавањем -grpstats."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Прикажи саобраћај сервера"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Прикажи саобраћај сервера<br>Приказује укупно слање/преузимање свих постојећих корисника у свим одељцима"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Прикажи укупно слање групе"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Приказује укупно слање групе<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Прикажи месечно слање групе"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Приказује месечно слање групе<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Прикажи месечно преузимање групе"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Приказује месечно преузимање групе<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Прикажи слање групе последње недеље"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Приказује слање групе последње недеље<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Прикажи преузимање групе последње недеље"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Приказује преузимање групе последње недеље<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Прикажи укупно преузимање групе"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Приказује укупно преузимање групе<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Учитавањем корисниковог корисничког фајла у своју меморију процеса, у суштини постајете тај корисник."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Учитавањем корисниковог корисничког фајла у своју меморију <br>процеса, у суштини постајете тај корисник (иако се неке <br>ствари попут почетног директоријума или приказа „site who“<br>неће променити). Потребна је -emulate дозвола у фајлу <br>подешавања. Ово је направљено због посебних скрипти, <br>да би могле да раде као неки корисник без потребе да знају <br>лозинку или да се пријављују као тај корисник. Већини <br>оператера сајта ово неће бити потребно.<br><br>Напомена: Ово није ПРАВА емулација, и не бисте требали да је <br>користите за озбиљне ствари. <br>Неке ствари ће радити; друге ће радити неправилно. Једини <br>начин да постигнете „праву“ емулацију је да се пријавите као <br>тај корисник.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Прикажи екран помоћи"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Приказује екран помоћи<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Прикажи неуспеле пријаве"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Приказује неуспеле пријаве<br><br>Ово приказује „/glftpd/ftp-data/logs/login.log“<br>Погледајте инфо о „site syslog“ за синтаксу.<br>"
+
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Прикажи недавно уништена издања"
+
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Приказује недавно уништена издања<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Провери када је корисник последњи пут био повезан"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Проверава када је корисник последњи пут био повезан<br><br><i>Пример:</i> site seen Arhimed<br><br>Ово ће приказати време када се Arhimed последњи пут пријавио.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Приказује кориснички фајл у сировом формату"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Приказује кориснички фајл у сировом формату<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Приказује детаљне податке о повезаним корисницима"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Приказује детаљне податке о повезаним корисницима<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Пошаљи маркере"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Нема доступних контаката>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Искључено у овој верзији КДЕ-а>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Послаћете ваше маркере KFTPGrabber-а до <b>%1</b>. Они могу садржати лозинке или осетљиве X509 сертификате: слањем ваших маркера можете угрозити њихову безбедност.<br><br>Да ли сте сигурни?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Пошаљи маркере"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Овај сервер је дистрибуирани FTP демон"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Сигурни сте да желите да избришете овај фајл(ове)?"
+
+#~ msgid "Date"
+#~ msgstr "Датум"
+
+#~ msgid "Permissions"
+#~ msgstr "Дозволе"
+
+#~ msgid "Owner"
+#~ msgstr "Власник"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Не могу да отворим директоријум „%1“."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Овај директоријум садржи %n фајл.\n"
+#~ "Овај директоријум садржи %n фајла.\n"
+#~ "Овај директоријум садржи %n фајлова."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Приказивање свега може да потраје."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Да ли сте сигурни?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Преносим..."
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Опште"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Додај нову шему"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Сигурни сте да желите да уклоните ову шему?"
+
+#~ msgid "&Other"
+#~ msgstr "&Остало"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Мала слова имена фајлова када се пре&узима"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "И&стицање"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "Дод&ај шему..."
+
+#~ msgid "E&dit..."
+#~ msgstr "Ур&еди..."
+
+#~ msgid "Re&move"
+#~ msgstr "&Уклони"
+
+#~ msgid "E&nabled"
+#~ msgstr "&Укључено"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Листа при&оритета"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Шема приоритета:"
+
+#~ msgid "Patterns"
+#~ msgstr "Шеме"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "Дод&ај шему"
+
+#~ msgid "&Low"
+#~ msgstr "&Низак"
+
+#~ msgid "Value:"
+#~ msgstr "Вредност:"
+
+#~ msgid "&Skip"
+#~ msgstr "Пре&скочи"
+
+#~ msgid "&High"
+#~ msgstr "В&исок"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Поставке листе приоритета"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "У&кључи листу приоритета"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "Прес&кочи празне фајлове"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Примени лист&у приоритета на директоријуме"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Не стављај у ред фајлове на листи прес&какања"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Стави у ред директоријуме пре фајлова"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "Листа шема фајлова за истицање при прегледању."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Да ли се фајлови са листе филтера требају нагласити."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Да ли се прескачу фајлови са листе прескакања."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Да ли се прескачу празни фајлови."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Да ли се листа прескакања примењује и на директоријуме."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Не стављај у ред фајлове са листе прескакања."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Стави у ред директоријуме пре фајлова."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Да ли ће имена свих фајлова који се преузимају бити малим словима."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "уредисеци"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "По&стави филтер..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Очисти филтер"
+
+#~ msgid "Filter"
+#~ msgstr "Филтер"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Унесите филтер:"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "Уређивач FTP маркера"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL поставке"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Режим преноса:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "П - приватни (интегритет и приватност)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - поверљиви (приватност без интегритета)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "С - сигурни (интегритет без приватности)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "Ч - Чист (без SSL-а)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Повезивање није успело (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Пренос:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Преуз: %1/s Посл: %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "SFTP Читам листу директоријума..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "SFTP Директоријум промењен у „%1“"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Почињем са преузимањем „%1“ фајла"
+
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr ""
+#~ "Пренесен %n бајт.\n"
+#~ "Пренесено %n бајта.\n"
+#~ "Пренесено %n бајтова."
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Почињем слање „%1“ фајла"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "FXP пренос није успео."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Подешавање заштићеног режима није успело, враћам на нешифровану везу."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Непознат домаћин „%1“."
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Не могу да успоставим узрочну SSL везу."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Узрочна SSL веза је успостављена."
+
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "Пасивни режим је омануо два пута, искључујем коришћење PASV!"
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Листање директоријума завршено."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Не могу да се повежем на сервер."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Искључен са сервера."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "Неусаглашени SSL режими на изворном и одредишном серверу."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "Настао је проблем при успостављању везе података."
+
+#~ msgid "Error reading file."
+#~ msgstr "Грешка при читању фајла."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "Не могу да се повежем на сервер."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Директоријум није у кешу."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Не могу да отворим директоријум."
+
+#~ msgid "View &Local"
+#~ msgstr "Погледај &локално"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Режим &ван везе"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "URL није у кешу."
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Директоријум није у кешу."
+
+#, fuzzy
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr "Време истицања преноса података (у секундама):"
+
+#~ msgid "Should the cache be used when browsing the sites."
+#~ 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/kftpgrabber.po b/translations/sr@Latn/messages/kftpgrabber.po
new file mode 100644
index 0000000..ba93ac1
--- /dev/null
+++ b/translations/sr@Latn/messages/kftpgrabber.po
@@ -0,0 +1,3653 @@
+# translation of kftpgrabber.po to Serbian
+# Slobodan Simic <simicsl@verat.net>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2005-11-14 10:45+0100\n"
+"Last-Translator: Slobodan Simic <simicsl@verat.net>\n"
+"Language-Team: Serbian <kde-yu@kde.org.yu>\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"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "povezujem se"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Direktorijum"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Prioritet"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Preuzmi"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Pošalji"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Ime fajla"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Veličina"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "P&romeni sajt"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Odredište"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP uvoz"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber uvoz"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp uvoz"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Svi planirani prenosi su završeni."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Fajl postoji"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - FTP klijent za KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Glavni programer"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Programer"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH kod"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc kod"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Kod za iskačući Kopete balon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Kontrola grafikona saobraćaja"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Dizajn ikone"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Testiranje i otklanjanje grešaka"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Ime direktorijuma:"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Prenosi sledećih fajlova su završeni:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "Veza sa „%1“ nije uspela."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "Prenos fajla nije uspeo."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Izvorni fajl se ne može naći."
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "Dozvole"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Ne mogu da otvorim fajl radi upisa."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Prenos sledećih fajlova <b>je prekinut</b> jer nije ostalo dovoljno slobodnog "
+"prostora na „%1“:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Ne mogu da uspostavim SSH vezu (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Prijavljujem se..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Prijava nije uspela."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Ne mogu da inicijalizujem SFTP kanal."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Ne mogu da inicijalizujem SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "isključen"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Povezujem se..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "Povezujem se na „%1:%2“..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Prekini"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+#, fuzzy
+msgid "Using cached directory listing."
+msgstr "Dobavljam listu direktorijuma..."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Dobavljam listu direktorijuma..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Prenosim..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Uklanjam direktorijume..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+#, fuzzy
+msgid "Renaming..."
+msgstr "Preimenuj"
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "Veza sa „%1“ nije uspela."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Ne mogu da se povežem."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Ponovo pokušavam vezivanje (%1/%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "Ne mogu da uspostavim TLS vezu."
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Čekam na vezu..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Veza uspostavljena."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "FXP prenos završen."
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Pregledam direktorijume..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Prenosim..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "isključen"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "Veza sa „%1“ nije uspela."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Neuposlen."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Provera završena!"
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Dobavljam listu direktorijuma..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Čekam %1 sekundi pre ponovnog povezivanja..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Preimenuj"
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Ponovo pokušavam vezivanje..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Ponovo pokušavam vezivanje..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Ponovni pokušaj prekinut."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Radnje ako fajl postoji (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Veličina/Vremenski pečat"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Isti"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Stariji"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Noviji"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Manji"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Veći"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Preskoči"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Prebriši"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Nastavi"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Preimenuj"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Pitaj"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Dnevnik (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Lokalna sesija"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Dnevnik"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Veza sa %1 je uspešno uspostavljena."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Dajte vašu lozinku ličnog ključa dešifrovanja."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Sesija"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Bar jedna sesija mora ostati otvorena na svakoj strani."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Završite sve prenose pre zatvaranja sesije."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Ova sesija je trenutno povezana. Sigurni ste da želite da se isključite?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Zatvori sesiju"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Brzo &povezivanje..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Nova sesija"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Leva strana"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Desna strana"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&Režim prenosa (Automatski)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binarno"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Automatski"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&Režim prenosa (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&Režim prenosa (Binarno)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Izaberi..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Nema ime"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Prenos"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Opis"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Nema neuspelih prenosa."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "Ponovo pok&reni prenos"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "Dod&aj u red"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Dodaj sve u red"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Ukloni"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Ukloni sve"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Sigurni ste da želite da uklonite ovaj neuspeli prenos?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Sigurni ste da želite da uklonite SVE neuspele prenose?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Oblik1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nova šema"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Šema imena fajla:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Boja:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Brzo povezivanje"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "ime domaćina"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "ispravan port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "korisničko ime"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "lozinka"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " i"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Unesite "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Dajte vašu lozinku X509 sertifikata dešifrovanja."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Sajtovi blizu vas"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Nema poznatih sajtova."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Šema"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Boja"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Dodaj šemu"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Uključeno"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Isticanje"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Još nije ubačeno.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Lista preskakanja"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII ekstenzije"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Opšte"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Prenosi"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Prikaz"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Radnje"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filteri"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Provera kontrolne sume"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Kontrolna suma"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Provera završena!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Ne mogu da otvorim fajl kontrolne sume ili fajl ima neispravan format!"
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Ime fajla"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Filteri"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Preuzmi"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Preimenuj"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Noviji"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Preimenuj"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "&Veza"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Traži i zameni"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Korišćenje opsega"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "zastoj"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "radi"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Čekam na vezu..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Ime"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Izvor"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Odredište"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Napredak"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Brzina"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Nemate nijedan fajl na redosledu."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Preuzmi"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "Niti"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Pokreni prenos"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "P&rekini prenos"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Ukloni &sve"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Pomeri &gore"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Pomeri &dole"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Pomeri &gore"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "&Izmeni info prenosa"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Učitaj redosled iz fajla"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Snimi redosled u fajl"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "Po&kreni"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Pauziraj"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "Dod&aj prenos..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Traži i zameni..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Prikaži &filter"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Sajt"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Sigurni ste da želite da uklonite fajl(ove) iz redosleda?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Sigurni ste da želite da uklonite SVE fajlove iz redosleda?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Učitavanje novog redosleda prebrisaće stari; sigurni ste da želite da "
+"nastavite?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Učitaj redosled"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Sesija sajta [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Nit %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "neuposlen"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "isključen"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "povezujem se"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "prenosim"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Stanje"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Nema trenutno aktivnih niti."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Nema markera."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Novi..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "P&reimenuj"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Napravi podkategoriju..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Dupliraj"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Sajt"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Ime kategorije"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Preimenuj kategoriju:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Ime nove kategorije"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Nova kategorija:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Novi server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Novi server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Sigurni ste da želite da uklonite ovu kategoriju?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Sigurni ste da želite da uklonite ovaj server?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Ne mogu da učitam izabrani priključak uvoza."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Označeni fajl ne postoji ili je nečitljiv."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Izvoz markera je završen."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "Ur&edi..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS Postavke"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Uvezi..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Izvezi..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "Uređivač FTP markera"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>Hoćete da izvezete vaše markere KFTPGrabber-a. Oni mogu sadržati lozinke "
+"ili osetljive X509 sertifikate: izvozom vaših markera možete ugroziti njihovu "
+"bezbednost."
+"<br>"
+"<br>Da li ste sigurni?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Izvezi markere"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Prekini"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Prikaži kao stablo"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "&Svojstva"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "I&seckaj"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Filteri"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "Lista prioriteta fajlova pri stavljanju u red."
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Prenos"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "Prenos u &red"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Napravi direktorijum..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Otvori fajl"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "Pro&veri..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Još radnji"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Izvezi listu direktorijuma..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Prikaži &skrivene fajlove i direktorijume"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Napravi direktorijum"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Pošalji sirovu naredbu"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "P&romeni sajt"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Brzo povezivanje..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "&Poveži se sa"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Prekini vezu"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Promeni udalj&eno kodiranje"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Da li hoćete da prekinete trenutnu vezu?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Sigurni ste da želite da ISECKATE ovaj fajl?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Iseckaj fajl"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr "Obriši fajl"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Preskoči"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Prioritet"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Napravi direktorijum"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Ime direktorijuma:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Pošalji sirovu naredbu"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Naredba:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Izvezi listu direktorijuma"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Opšte"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Udaljena fascikla"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Nepoznat"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Vrsta:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Lokacija:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Veličina:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Napravljen:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Dozvole"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Dozvole pristupa"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klasa"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Prikaz\n"
+"stavki"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Čitanje"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Upis\n"
+"stavki"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Upis"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Uđi"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Izvrši"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Specijalno"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Korisnik"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupa"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Ostali"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Podesi UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Podesi GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Lepljiv"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Koreni direktorijum"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Putanja: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Ovo je SSH šifrovana veza. Podaci o sertifikatu trenutno nisu dostupni."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Filteri"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Napravi direktorijum"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Lista fajlova"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "P&romeni sajt"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> beležnik inicijalizovan.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Ne mogu da otvorim fajl radi upisa."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Ne mogu da nađem %1 XML opisni fajl grafičkog okruženja. Proverite da li "
+"ste ispravno instalirali program! Ako imate nekih pitanja, pitajte na %2."
+"<br>"
+"<br><b>Upozorenje:</b> Trenutno grafičko okruženje će biti nepotpuno!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Zatvaranjem glavnog prozora KFTPGrabber će ostati da radi u sistemskoj "
+"kaseti. Koristite <b>Završi</b> iz menija <b>KFTPGrabber-a</b> "
+"da biste izašli iz programa.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Pristajem u sistemsku kasetu"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Trenutno je u toku %n prenos.\n"
+"Trenutno su u toku %n prenosa.\n"
+"Trenutno je u toku %n prenosa."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Sigurni ste da želite da završite?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP sajtovi blizu mene"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Sajtovi u KWallet-u"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Uredi markere..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Preuzimanje: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Slanje: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Redosled"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Neuspeli prenosi"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Sajtovi blizu mene"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Niti"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Saobraćaj"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopija"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Ovaj fajl sa markerima je šifrovan. Unesite ključ za dešifrovanje."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Dešifrovanje fajla markera sa datim ključem nije uspelo. Želite li da <b>"
+"prebrišete</b> markere sa praznim fajlom?"
+"<br>"
+"<br><font color=\"red\"><b>Upozorenje:</b> Ako prebrišete, svi trenutni markeri "
+"biće izgubljeni.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Dešifrovanje nije uspelo"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Prebriši markere"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Unesite ključ za dešifrovanje fajla sa markerima."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Nema objavljenih usluga>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD nije dostupan>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Nema sajtova u KWallet-u>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Slobodan Simić"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "simicsl@verat.net"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "P&rikaz"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Pregledač fajlova"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Prikaži &skrivene fajlove i direktorijume"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Prikaži stablo &direktorijuma"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "Prikaži ve&ličinu u bajtovima (menja „ljudima čitljiv“ format)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Prikaži &vlasnika i grupu za svaki fajl"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "Prikaži stablo &direktorijuma"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "Prikaži &filter"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Traženje i menjanje redosleda"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Pomoću ovog dijaloga možete napraviti masovne zamene putanja odredišta/izvora "
+"za prenose u redosledu. <b>Izmene se ne mogu opovrgnuti.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Traži šta"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Odredište:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Izvor:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Traži samo prenose na određenom serveru"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Info servera"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Ime servera:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Domaćin:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Lozinka:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Korisničko ime:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Zameni sa"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Čarobnjak uvoza markera"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Korak 1: <b>Izaberite priključak uvoza</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Slika"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Izaberite odgovarajući priključak sa liste ispod. Svaki priključak može uvoziti "
+"iz jednog određenog formata."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Dostupni priključci uvoza:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Korak 2: <b>Izaberite fajl markera za uvoz</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Izaberite fajl markera iz kog želite da uvezete vaše markere. Podrazumevana "
+"putanja je već određena na osnovu priključka uvoza."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Putanja markera:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Korak 3: <b>Uvoz markera...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Sačekajte dok se markeri uvoze."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Napredak uvoza:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Izgled"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Font i boje"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Font:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Boja naredbi klijenta:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Boja odgovora servera:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Boja višelinijskog odgovora:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Boja poruka greške:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Boja poruka stanja:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Izlaz"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Izlaz &fajla"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Snimi dnevnik u fajl"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Izlazni fajl:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Info izvornog servera"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Info odredišnog servera"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Izvor:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Odredište:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Vrsta prenosa:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "&Veza"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "IP aktivne veze"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "Prinudi PORT/EPRT da &koristi podešeni IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/Ime domaćina:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Opseg portova aktivne veze"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Koristi &samo portove iz navedenog opsega"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Najmanji port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Najveći port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Vremena isticanja"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Vreme isticanja kontrole veze (u sekundama):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Vreme isticanja prenosa podataka (u sekundama):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Ograničenje brzine"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Preuzimanje (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Slanje (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Prostor na dis&ku"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Provera slobodnog prostora diska"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Zaustavi prenos ako &nema dovoljno prostora"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Razmak (s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Najmanje slobodnog prostora (Mb):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "L&anci"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Broj lanaca po sesiji:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Nema neuspelih prenosa."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Ostalo"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "Stavi u &red fajlove (umesto prenosa) kada se „prevuče-i-pusti“"
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "Preskoči prazne direkt&orijume"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Potvrdi isključenje &pre isključivanja"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "Svojstva ftp sajta"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Ime domaćina:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokol:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP preko TLS/SSL (izričito)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP preko TLS/SSL (uzročno)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP preko SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Oznaka sajta:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Udaljeni direktorijum:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Lokalni direktorijum:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonimno prijavljivanje"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "N&apredno"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "&Isključi upotrebu dodatnog pasivnog režima"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Isključi upotrebu pasivnog režima"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Koristi STAT za liste direktorijuma"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Lanci višestrukih prenosa"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Ne koristi višestruke lance za ovaj sajt"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Kodovanje servera"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kodovanje:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Pono&vo pokušaj povezivanje pri grešci"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Pokušaj ponovo"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Broj ponovnih pokušaja (0 = neograničeno):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Razmak pokušaja:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII &nastavci"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Dodaj nastavak"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Nastavak:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Nastavak"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Ponovo pokušavam vezivanje..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Ponovo pokušavam vezivanje..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Unesite ceo URL unutar ovog polja"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Unesite ime ftp domaćina"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anon&imno prijavljivanje"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Proveri anonimne prijave"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Unesite korisničko ime naloga"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Unesite lozinku naloga"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Dodaj u &markere"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Napredno"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Veza uspostavljena."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Koristi STAT za liste direktorijuma"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 sertifikat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Koristi sledeći SSL sertifikat pri povezivanju"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Putanja:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-&adresa"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "&Koristi e-adresu iz kontrolnog centra"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-adresa:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Pokretanje i završavanje"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Potvrdi &izlaz ako ima aktivnih prenosa"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Pokreni program minimi&ziran u kaseti"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Prikaži &uvodni ekran pri pokretanju"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Prikaži ikonu u ka&seti"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Podrazumevano na sajtu"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Ši&fruj fajl sa markerima"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, fuzzy, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Prikaži sajtove iz KWallet-a u &markerima"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Obaveštenja"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Oblačići"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Prikaži o&blačić kad se prenos završi"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Prikaži samo ako nema više &planiranih prenosa"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Prikaži oblačić kada &uspe ponovno vezivanje"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Fajl:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "nijedan"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Lista fajlova"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Neobrađen"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "U redu"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Nije nađen"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Neuspešan"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Veličina glavnog prozora."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Pozicija glavnog prozora na ekranu."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Podrazumevani broj ponovnih pokušaja za nove sajtove."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Podrazumevani razmak između pokušaja za nove sajtove."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Da li će se prikazivati oblačić kada se neka radnja završi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr ""
+"Da li će se prikazivati oblačić kada su svi prenosi iz redosleda završeni."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Da li će se prikazivati oblačić kada se, nakon ponovnog pokušaja, veza sa "
+"serverom uspešno uspostavi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Treba li korisnik da potvrdi izlaz ako su u prenosi u toku."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Status šifrovanja fajla sa markerima."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Podrazumevani lokalni direktorijum."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Da li će se program pokretati kao minimiziran."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Da li će se program pokretati kao minimiziran."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Da li se uvodni ekran prikazuje pri pokretanju programa."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Da li se prikazuje ikona u sistemskoj kaseti."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Da li se sajtovi iz KWallet-a trebaju prikazivati u markerima."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Da li se dijalog „potvrdi isključivanje“ treba prikazivati svaki put kada se "
+"zatraži isključenje."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Podrazumevano kodiranje sajta."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr "Lista šema fajlova gde se ASCII režim koristi za prenos."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Da li se preskaču prazni direktorijumi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Font koji treba koristiti za dnevnik."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Boja naredbi koje se šalju serveru."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Boja odgovora sa servera."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Boja višelinijskih odgovora servera."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Boja poruka greške."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Boja statusnih poruka."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Da li dnevnik treba da se upisuje i u fajl."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Fajl u koji će se upisivati dnevnik."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr "Da li će port iz navedenog opsega biti izabran pri aktivnim prenosima."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Početak opsega portova."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Kraj opsega portova."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Da li će IP biti pregažen kada se rade aktivni prenosi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "IP koji će se slati kada se pregazi PORT naredba."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Da li će se prenosi stavljati u red umesto da se pokrenu, kada se koristi "
+"prevuci-i-pusti."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Da li će kftpgrabber proveravati slobodan prostor i prekinuti prenos ako ga "
+"nema dovoljno."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Razmak provera diska."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Najmanje slobodnog prostora (u MB) koji mora biti dostupan."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Koristi globalnu e-adresu KDE-a za lozinku anonimusa."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "E-adresa koja bi trebalo da se koristi za lozinku anonimusa."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Broj lanaca koji se koristi pri prenosu."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Treba li korisnik da potvrdi izlaz ako su u prenosi u toku."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Vreme isteka (u sekundama) za kontrolu veze."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Vreme isteka (u sekundama) za prenose podataka."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Ograničenje brzine ukupnog preuzimanja (kb/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Ograničenje brzine ukupnog slanja (kb/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Da li se podrazumeva da se prikazuje i stablo direktorijuma."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Da li će se pri pregledanju prikazivati skriveni fajlovi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Da li će se veličina fajla prikazivati u bajtovima a ne u „ljudima čitljivoj“ "
+"formi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Da li će vlasnik i grupa biti prikazivani za svaki fajl."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "Prikaži stablo &direktorijuma"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "Prikaži &filter"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Glavni meni"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Traka sa markerima"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "Nije navedeno korisničko ime za „%1“."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Greška pri povezivanju"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Prikaz"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Brzo povezivanje"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Ne mogu da nađem program za otvaranje ovog fajla!"
+
+#~ msgid "Webpage design"
+#~ msgstr "Dizajn veb stranice"
+
+#~ msgid "Command"
+#~ msgstr "Naredba"
+
+#~ msgid "What's this?"
+#~ msgstr "Šta je ovo?"
+
+#~ msgid "Server Management"
+#~ msgstr "Upravljanje serverima"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "Preuzeto: %1 MB Poslato: %2 MB<br>Krediti: %3 MB Odnos: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Dijalog naredbi sajta"
+
+#~ msgid "Username"
+#~ msgstr "Korisničko ime"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Unesite korisničko ime ili pritisnite otkaži"
+
+#~ msgid "Group name"
+#~ msgstr "Ime grupe"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Unesite grupu ili pritisnite otkaži"
+
+#~ msgid "Description name"
+#~ msgstr "Ime opisa"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Unesite opis ili pritisnite otkaži"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Lozinke se ne poklapaju"
+
+#~ msgid "Optional"
+#~ msgstr "Opciono"
+
+#~ msgid "Password retype:"
+#~ msgstr "Lozinka ponovo:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Pošalji si&rovu naredbu..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Prikazuje vaše vreme mirovanja"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Postavite vaše vreme mirovanja (po sesiji)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Postavite vaše vreme mirovanja (po sesiji).<br>Ovde se određuje vaše vreme mirovanja (vreme koje možete biti <br>povezani a da se ništa ne radi). Najveće vreme mirovanja je 7200 sekundi.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Ovo će izmeniti vašu lozinku"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Ovo će izmeniti vašu lozinku.<br>Lozinka može biti najviše 8 znakova dugačka."
+
+#~ msgid "Display the group info"
+#~ msgstr "Prikaži podatke grupe"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Prikazuje podatke o grupi<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Prikaži trenutne alijase"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Prikaži trenutni cdpaths"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Prikaži trenutnu glftpd verziju"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Prikazuje trenutnu glftpd verziju<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Prikaži korisnike trenutno na vezi"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Prikazuje korisnike koji su trenutno na vezi<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Prikaži ekran dobrodošlice"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Prikazuje ekran dobrodošlice<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Prikaži trenutno vreme na sajtu"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Prikazuje koje je trenutno vreme na sajtu<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "Prikaži nedavno povraćena izdanja"
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "Prikazuje nedavno povraćena izdanja<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Obriši korisnika, može biti vraćen sa site READD"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Briše korisnika koji može biti vraćen sa site READD<br><br><i>Primer:</i> site deluser Arhimed<br><br>Ovo će aktivirati zastavicu DELETED (6) za korisnika „Arhimed“.<br>Da biste u potpunosti obrisali ovog korisnika morate da uradite „site purge“<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Izmeni lozinku korisnika"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Menja lozinku korisnika<br><i>Primer:</i> site chpass Arhimed novalozinka<br>Ovo će promeniti lozinku u „novalozinka“ za<br>korisnika „Arhimed“.<br><br>Vidi „site passwd“ za više informacija ako dobijate grešku<br>da lozinka nije dovoljno sigurna.<br><br>* Označava bilo koju lozinku, <i>Primer:</i> site chpass arch *<br>Ovo će omogućiti da se arch prijavi sa bilo kojom lozinkom<br><br>@ Označava loziku kao e-adresu, <i>Primer:</i> site chpass arch @<br>Ovo će omogućiti da se arch prijavi sa a@b.com ali ne i ab.com<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Menjaj gadmin stanje korisnika za datu grupu"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Menja gadmin stanje korisnika za datu grupu<br><b>Napomena:</b> Kada korisnik postane gadmin automatski će mu se<br>dodati zastavica 2. Kada korisnik prestane da bude gadmin bilo<br>koje od grupa gadmin zastavica će se automatski<br>ukloniti.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Prikaži zastavice korisnika"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Prikazuje zastavice korisnika<br><br><i>Primer:</i> site flags<br><br>Ovo će prikazati vaše zastavice.<br><br><i>Primer:</i> site flags Arhimed<br><br>Ovo će prikazati zastavice korisnika Arhimed.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Izbaci korisnika sa sajta"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Izbacuje korisnika sa sajta<br><br><i>Primer:</i> site kick Arhimed<br><br>Ovo će prekinuti sve veze korisnika „Arhimed“<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Ukloni obrisane korisnike, site READD za očišćene korisnike NEĆE raditi."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Uklanja obrisane korisnike, site READD neće raditi za očišćene korisnike.<br><br><i>Primer:</i> site purge<br>Ovo će UKLONITI SVE korisnike koji imaju zastavicu DELETED.<br><br><i>Primer:</i> site purge zika<br>Ovo će ukloniti samo korisnika zika a ostatak obrisanih korisnika ostaviti na sajtu<br><br>Ako ste vi gadmin, možete očistiti samo korisnike iz vaše grupe (to jest,<br>ako vam je dat pristup ovoj naredbi u fajlu podešavanja).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Ponovo dodaj korisnika"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Ponovo dodaj korisnika<br><br><i>Primer:</i> site readd<br><br>Ovo će prikazati listu korisnika koji se mogu ponovo dodati.<br>(Ovo možete postići i sa „site users deleted“)<br><br><i>Primer:</i> site readd Arhimed<br><br>Ovo će ukloniti zastavicu DELETED za korisnika „Arhimed“.<br><br><b>Napomena:</b> Kada ponovo dodajete korisnika određene grupe, grupa mora imati slobodno mesto, <br>čak iako ste vi operator sajta.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Prikaži statistiku slanja/preuzimanja korisnika"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Prikaži statistiku slanja/preuzimanja korisnika<br><br>Definiše se u „/ftp-data/text/user.stats“<br><br>Ako imete višestruke odeljke onda će ovo prikazati<br>statistiku svih odeljaka. (Ali morate iskopirato ovaj fajl u<br>SECTIONuser.stats. npr: ako imate odeljak GAMES onda će glftpd<br>tražiti fajlove user.stats i GAMESuser.stats u /ftp-data/text.<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Listaj korisnike / Prikaži detalje o korisniku"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Listaj korisnike / Prikaži detalje o korisniku<br><br><i>Primer:</i> site user<br><br>Prikazuje listu korisnika koji su trenutno na sajtu.<br><br><i>Primer:</i> site user Arhimed<br><br>Ovo će prikazati detaljne podatke o korisniku „Arhimed“.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Prikaži dostupne grupe"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Prikaži detaljne podatke o grupi"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Prikazuje detaljne podatke o grupi<br><br><i>Primer:</i> site ginfo ftp<br><br>Ovo će prikazati detaljne podatke o grupi „ftp“.<br>Ako je korisnik obrisan, njegov naslov će biti zamenjen sa „***DELETED***“.<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Dodaj novu grupu"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Dodaje novu grupu<br><br><i>Primer:</i> site grpadd grupa nova_grupa<br><br>Ovo će dodati novu grupu „grupa“ sa opisom „nova_grupa“.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Obriši grupu"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Briše grupu<br><br><i>Primer:</i> site grpdel grupa<br><br>Ovo će izbrisati grupu „grupa“.<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Prikazuje vašu trenutnu grupu ili vrši pridruživanje/napuštanje grupe"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Prikazuje vašu trenutnu grupu ili vrši pridruživanje/napuštanje grupe<br>Da biste se pridružili grupi dodajte ime grupe kao parametar<br>naredbi. Morate napustiti sve grupe pre priključivanja novoj.<br>Samo korisnici sa zastavicom siteop mogu menjati lične<br>grupe (vidi site CHGRP).<br><br><i>Primer:</i> site group<br><br>Ovo će prikazati grupu u kojoj se nalazite.<br><br><i>Primer:</i> site group ftp<br><br>Sa ovim ćete napustiti ili se pridružiti grupi „ftp“.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Menja opis grupe"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Menja opis grupe<br><br><i>Primer:</i> site grpnfo ftp novi_opis<br><br>Ovo će promeniti trenutni opis grupe „ftp“ u<br>„novi_opis“.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Prikazuje vašu trenutnu liniju stanja"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Prikaži sve preuzimače"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Prikazuje sve preuzimače"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Prikaži sve preuzimače koji su u grupi"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikazuje sve preuzimače.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Prikaži sve pošiljaoce"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Prikaži sve pošiljaoce koji su u grupi"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži sve pošiljaoce.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Prikaži slanja danas"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Prikaži današnje pošiljaoce koji su u grupi"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži današnja slanja.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Prikaži preuzimanje danas"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Prikaži današnje preuzimače koji su u grupi"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži današnja preuzimanja.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Prikaži slanje poslednjeg meseca"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Prikaži pošiljaoce poslednjeg meseca koji su u grupi"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži slanje poslednjeg meseca.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Prikaži preuzimanje poslednjeg meseca"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Prikaži preuzimače poslednjeg meseca koji su u grupi"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži preuzimanje poslednjeg meseca.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display all-time nuketop"
+#~ msgstr "Prikaži najviše uništavane"
+
+#~ msgid "Display alltime nuketop"
+#~ msgstr "Prikazuje najviše uništavane"
+
+#~ msgid "Display all-time nuketop who belongs to the group"
+#~ msgstr "Prikaži najviše uništavane koji su u grupi"
+
+#~ msgid "Display alltime nuketop.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži najviše uništavane.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Prikaži pošiljaoce poslednje nedelje"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Prikaži pošiljaoce poslednje nedelje koji su u grupi"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži pošiljaoce poslednje nedelje.<br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Prikaži preuzimače poslednje nedelje"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Prikaži preuzimače poslednje nedelje koji su u grupi"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Prikaži preuzimače poslednje nedelje. <br>Parametar <group> nije neophodan. Ako ga navedete<br>prikazaće se samo korisnici koji su u toj grupi, ali korisnik <br>koji ovo radi mora imati poseban pristup u glftpd.conf.<br>Ovo se kontroliše sa podešavanjem -grpstats."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Prikaži saobraćaj servera"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Prikaži saobraćaj servera<br>Prikazuje ukupno slanje/preuzimanje svih postojećih korisnika u svim odeljcima"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Prikaži ukupno slanje grupe"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Prikazuje ukupno slanje grupe<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Prikaži mesečno slanje grupe"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Prikazuje mesečno slanje grupe<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Prikaži mesečno preuzimanje grupe"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Prikazuje mesečno preuzimanje grupe<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Prikaži slanje grupe poslednje nedelje"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Prikazuje slanje grupe poslednje nedelje<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Prikaži preuzimanje grupe poslednje nedelje"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Prikazuje preuzimanje grupe poslednje nedelje<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Prikaži ukupno preuzimanje grupe"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Prikazuje ukupno preuzimanje grupe<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Učitavanjem korisnikovog korisničkog fajla u svoju memoriju procesa, u suštini postajete taj korisnik."
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Učitavanjem korisnikovog korisničkog fajla u svoju memoriju <br>procesa, u suštini postajete taj korisnik (iako se neke <br>stvari poput početnog direktorijuma ili prikaza „site who“<br>neće promeniti). Potrebna je -emulate dozvola u fajlu <br>podešavanja. Ovo je napravljeno zbog posebnih skripti, <br>da bi mogle da rade kao neki korisnik bez potrebe da znaju <br>lozinku ili da se prijavljuju kao taj korisnik. Većini <br>operatera sajta ovo neće biti potrebno.<br><br>Napomena: Ovo nije PRAVA emulacija, i ne biste trebali da je <br>koristite za ozbiljne stvari. <br>Neke stvari će raditi; druge će raditi nepravilno. Jedini <br>način da postignete „pravu“ emulaciju je da se prijavite kao <br>taj korisnik.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Prikaži ekran pomoći"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Prikazuje ekran pomoći<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Prikaži neuspele prijave"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Prikazuje neuspele prijave<br><br>Ovo prikazuje „/glftpd/ftp-data/logs/login.log“<br>Pogledajte info o „site syslog“ za sintaksu.<br>"
+
+#~ msgid "Display recently nuked releases"
+#~ msgstr "Prikaži nedavno uništena izdanja"
+
+#~ msgid "Display recently nuked releases<br>"
+#~ msgstr "Prikazuje nedavno uništena izdanja<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "Proveri kada je korisnik poslednji put bio povezan"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "Proverava kada je korisnik poslednji put bio povezan<br><br><i>Primer:</i> site seen Arhimed<br><br>Ovo će prikazati vreme kada se Arhimed poslednji put prijavio.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Prikazuje korisnički fajl u sirovom formatu"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Prikazuje korisnički fajl u sirovom formatu<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Prikazuje detaljne podatke o povezanim korisnicima"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Prikazuje detaljne podatke o povezanim korisnicima<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Pošalji markere"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Nema dostupnih kontakata>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<Isključeno u ovoj verziji KDE-a>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>Poslaćete vaše markere KFTPGrabber-a do <b>%1</b>. Oni mogu sadržati lozinke ili osetljive X509 sertifikate: slanjem vaših markera možete ugroziti njihovu bezbednost.<br><br>Da li ste sigurni?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Pošalji markere"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Ovaj server je distribuirani FTP demon"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Sigurni ste da želite da izbrišete ovaj fajl(ove)?"
+
+#~ msgid "Date"
+#~ msgstr "Datum"
+
+#~ msgid "Permissions"
+#~ msgstr "Dozvole"
+
+#~ msgid "Owner"
+#~ msgstr "Vlasnik"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "Ne mogu da otvorim direktorijum „%1“."
+
+#~ msgid ""
+#~ "_n: This directory contains 1 file.\n"
+#~ "This directory contains %n files."
+#~ msgstr ""
+#~ "Ovaj direktorijum sadrži %n fajl.\n"
+#~ "Ovaj direktorijum sadrži %n fajla.\n"
+#~ "Ovaj direktorijum sadrži %n fajlova."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Prikazivanje svega može da potraje."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Da li ste sigurni?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Prenosim..."
+
+#, fuzzy
+#~ msgid "GeneralSettings"
+#~ msgstr "Opšte"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Dodaj novu šemu"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Sigurni ste da želite da uklonite ovu šemu?"
+
+#~ msgid "&Other"
+#~ msgstr "&Ostalo"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Mala slova imena fajlova kada se pre&uzima"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "I&sticanje"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "Dod&aj šemu..."
+
+#~ msgid "E&dit..."
+#~ msgstr "Ur&edi..."
+
+#~ msgid "Re&move"
+#~ msgstr "&Ukloni"
+
+#~ msgid "E&nabled"
+#~ msgstr "&Uključeno"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Lista pri&oriteta"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Šema prioriteta:"
+
+#~ msgid "Patterns"
+#~ msgstr "Šeme"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "Dod&aj šemu"
+
+#~ msgid "&Low"
+#~ msgstr "&Nizak"
+
+#~ msgid "Value:"
+#~ msgstr "Vrednost:"
+
+#~ msgid "&Skip"
+#~ msgstr "Pre&skoči"
+
+#~ msgid "&High"
+#~ msgstr "V&isok"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Postavke liste prioriteta"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "U&ključi listu prioriteta"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "Pres&koči prazne fajlove"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "Primeni list&u prioriteta na direktorijume"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "Ne stavljaj u red fajlove na listi pres&kakanja"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Stavi u red direktorijume pre fajlova"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "Lista šema fajlova za isticanje pri pregledanju."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Da li se fajlovi sa liste filtera trebaju naglasiti."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Da li se preskaču fajlovi sa liste preskakanja."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Da li se preskaču prazni fajlovi."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Da li se lista preskakanja primenjuje i na direktorijume."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Ne stavljaj u red fajlove sa liste preskakanja."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Stavi u red direktorijume pre fajlova."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Da li će imena svih fajlova koji se preuzimaju biti malim slovima."
+
+#~ msgid ""
+#~ "_: &Shred\n"
+#~ "editshred"
+#~ msgstr "urediseci"
+
+#~ msgid "&Set Filter..."
+#~ msgstr "Po&stavi filter..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Očisti filter"
+
+#~ msgid "Filter"
+#~ msgstr "Filter"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Unesite filter:"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "Uređivač FTP markera"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL postavke"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Režim prenosa:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - privatni (integritet i privatnost)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - poverljivi (privatnost bez integriteta)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - sigurni (integritet bez privatnosti)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "Č - Čist (bez SSL-a)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Povezivanje nije uspelo (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Prenos:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Preuz: %1/s Posl: %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "SFTP Čitam listu direktorijuma..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "SFTP Direktorijum promenjen u „%1“"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Počinjem sa preuzimanjem „%1“ fajla"
+
+#~ msgid ""
+#~ "_n: Transferred 1 byte.\n"
+#~ "Transferred %n bytes."
+#~ msgstr ""
+#~ "Prenesen %n bajt.\n"
+#~ "Preneseno %n bajta.\n"
+#~ "Preneseno %n bajtova."
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "Počinjem slanje „%1“ fajla"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "FXP prenos nije uspeo."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Podešavanje zaštićenog režima nije uspelo, vraćam na nešifrovanu vezu."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Nepoznat domaćin „%1“."
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Ne mogu da uspostavim uzročnu SSL vezu."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Uzročna SSL veza je uspostavljena."
+
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "Pasivni režim je omanuo dva puta, isključujem korišćenje PASV!"
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Listanje direktorijuma završeno."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Ne mogu da se povežem na server."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Isključen sa servera."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "Neusaglašeni SSL režimi na izvornom i odredišnom serveru."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "Nastao je problem pri uspostavljanju veze podataka."
+
+#~ msgid "Error reading file."
+#~ msgstr "Greška pri čitanju fajla."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "Ne mogu da se povežem na server."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Direktorijum nije u kešu."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Ne mogu da otvorim direktorijum."
+
+#~ msgid "View &Local"
+#~ msgstr "Pogledaj &lokalno"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Režim &van veze"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "URL nije u kešu."
+
+#, fuzzy
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "Direktorijum nije u kešu."
+
+#, fuzzy
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr "Vreme isticanja prenosa podataka (u sekundama):"
+
+#~ msgid "Should the cache be used when browsing the sites."
+#~ msgstr "Da li će se koristiti keš pri pregledanju sajta."
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/kftpgrabber.po b/translations/sv/messages/kftpgrabber.po
new file mode 100644
index 0000000..9fd5782
--- /dev/null
+++ b/translations/sv/messages/kftpgrabber.po
@@ -0,0 +1,2945 @@
+# translation of kftpgrabber.po to Swedish
+#
+# Stefan Asserhäll <stefan.asserhall@comhem.se>, 2005, 2006, 2007.
+# Stefan Asserhall <stefan.asserhall@comhem.se>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2007-04-09 17:19+0200\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"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "innehåller"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "innehåller inte"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "är lika med"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "är skild från"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "motsvarar reguljärt uttryck"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "motsvarar inte reguljärt uttryck"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "är"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "är inte"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Katalog"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "är större än"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "är mindre än"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "byte"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "Välj en åtgärd."
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "Prioritet:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Ladda ner"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Ladda upp"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr "Okänd tagg vid tolkning av kommandon för egen plats."
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+"<qt>Begärd åtgärd har misslyckats. Svaret från servern är:"
+"<br/><br /><b>%1</b></qt>"
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+"<qt>Hanteringsmodulen <b>%1</b> kan inte hittas för att tolka svar.</qt>"
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Filnamn"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "Posttyp"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Storlek"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "Ändra prioritet"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr "Hoppa över vid tillägg i kö"
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr "Färglägg i listvy"
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "Dölj från listvy"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "Mål med små bokstäver"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "Namnlös regel"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "Import från gFTP"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPgrabber import"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "Import från NcFTP"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla 3-import"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Alla köade överföringar är färdiga."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Filen finns"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPgrabber - En FTP-klient för KDE"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr "En valfri webbadress att ansluta till"
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPgrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Huvudutvecklare"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Utvecklare"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH-kod"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc-kod"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "Skärmmeddelandekod KopeteBalloon"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Grafisk komponent för trafikdiagram"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Design av ikoner"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Test och avlusning"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "Katalogtolkningskod"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr "Kolumnhanteringskod i listvy"
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Överföring av följande filer är färdig:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "Anslutning till servern har misslyckats."
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "Inloggning på servern har misslyckats"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Källfilen kan inte hittas."
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "Tillåtelse nekades."
+
+#: src/kftptransferfile.cpp:239
+msgid "Unable to open local file for read or write operations."
+msgstr "Kan inte öppna lokal fil för läsning eller skrivning."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "Överföringen misslyckades av någon orsak."
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Överföring av följande filer <b>har avbrutits</b> eftersom det inte finns "
+"tillräckligt med ledigt utrymme på '%1':"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "Kan inte upprätta en SSH-anslutning (%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Loggar in..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "Ansluten till servern, försöker logga in..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "Inloggning misslyckades."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "Interaktiv behörighetskontroll via tangentbord lyckades."
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "Behörighetskontroll med öppen nyckel lyckades."
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "Kan inte initiera SFTP-kanal."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "Kan inte initiera SFTP."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "Ansluten."
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Ansluter..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "Ansluter till %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "Avbruten."
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Använder lagrad kataloglistning."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Hämtar kataloglistning..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "Överför..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "Laddar ner filen '%1'..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "Laddar upp filen '%1'..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "Tar bort..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "Byter namn..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "Ändrar läge..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "Anslutning har misslyckats."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+"SSL-förhandling lyckades. Anslutningen är säkrad med %1-bitars %2 kryptering."
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr "SSL-förhandling misslyckades. Inloggning avbruten."
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr "SSL-förhandlingsbegäran misslyckades. Inloggning avbruten."
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr "SSL-förhandling misslyckades. Anslutning avbruten."
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr "Ansluten till servern, väntar på välkomstmeddelande..."
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "Misslyckades ansluta (%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr "Inkompatibel adressfamilj för PORT, men EPRT stöds inte. Avbryter."
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr "Upprättar data-anslutning med %1:%2..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "Kan inte upprätta ett lyssnaruttag."
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "Väntar på data-anslutning på port %1..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "Data-anslutning upprättad."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr "Datakanal säkrad med %1-bitars SSL."
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr "SSL-förhandling för datakanalen misslyckades. Avbryter överföring."
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "Överföring färdig."
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "Skapar katalog..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+"Ingen server stöder SSCN/CPSV, men en SSL-dataanslutning begärdes. Avbryter "
+"överföringen."
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "Överför filen '%1'..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr "Skickar håll-vid-liv..."
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "Nerkopplad."
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "Tidsgräns för anslutning har gått ut."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Overksam."
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "Sökning färdig."
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "Startar rekursiv katalogsökning..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Väntar %1 sekunder innan återanslutning..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "Väntar..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "Försöker ansluta igen (%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "Försöker ansluta igen..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Försök avbrutet."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Det finns åtgärder för filen (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Storlek/Tidstämpel"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Samma"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Äldre"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Nyare"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Mindre"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Större"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Hoppa över"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Skriv över"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Återuppta"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Byt namn"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Fråga"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Logg (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Lokal session"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Logg"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "Anslutning till %1 har upprättats med lyckat resultat."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Tillhandahåll lösenord för din privata avkodningsnyckel."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Session"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Åtminstone en session måste förbli öppen på varje sida."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Avsluta alla överföringar innan sessionen stängs."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Det här session är för närvarande ansluten. Är du säker på att du vill koppla "
+"ner?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Stäng session"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "&Snabbanslutning..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Ny session"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Vänster sida"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Höger sida"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "Ö&verföringsläge (Automatiskt)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "Binärt"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Automatiskt"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "Ö&verföringsläge (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "Ö&verföringsläge (Binärt)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Välj..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "Namnlös"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Överför"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Beskrivning"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Det finns inga misslyckade överföringar."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "Sta&rta om överföring"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Lägg till i kö"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Lägg till alla i kö"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "&Ta bort"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Ta bort alla"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Är du säker på att du vill ta bort den här misslyckade överföringen?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Är du säker på att du vill ta bort ALLA misslyckade överföringar?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Formulär1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Nytt mönster"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Filnamnsmönster:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Färg:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Snabbanslutning"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr "Rensa lista med senast besökta platser?"
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "ett värddatornamn"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "en giltig port"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "ditt användarnamn"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "ditt lösenord"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr " och"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Skriv in "
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Tillhandahåll ditt X509-certifikat för avkodning av lösenord."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Platser nära dig"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Inga platser publicerade."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Mönster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Färg"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Lägg till mönster"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Aktiverad"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Färgläggning"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Ännu inte implementerad.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Hoppa över lista"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII-utökningar"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Allmänt"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Överföringar"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Visa"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Åtgärder"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Filter"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Verifiering av checksumma"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Checksumma"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Verifikation färdig."
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Kan inte öppna checksummefil, eller har filen ett felaktigt format."
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "Filter &aktiverat"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "Inga filter."
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "Upp"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "Ner"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "Byt namn..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "Ny"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "Byt namn på regel"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr "Byt namn på regel '%1' till:"
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "Villkor"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr "Matcha a&lla följande"
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr "Matcha nå&gon av följande"
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Sök och ersätt"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Användning av bandbredd"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "Fler"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "Färre"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "Rensa"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "avstannad"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "kör"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Väntar på anslutning..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Filter: "
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "Namn"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Källa"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Mål"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Förlopp"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Hastighet"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "Ankomst"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Du har inga filer i kön."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr "Begränsa överföringshastighet för nerladdning"
+
+#: src/widgets/queueview/queueview.cpp:509
+msgid "Down: "
+msgstr "Ner: "
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr "Begränsa överföringshastighet för uppladdning"
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr "Upp: "
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr "Antal överföringstrådar per session"
+
+#: src/widgets/queueview/queueview.cpp:528
+msgid "Threads: "
+msgstr "Trådar: "
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "&Starta överföring"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Avbryt överföring"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "&Ta bort alla"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Flytta &upp"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Flytta &ner"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "Flytta längst &upp"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "Flytta längst &ner"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Ä&ndra överföringsinformation"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Ladda kö från fil"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Spara kö till fil"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "S&tarta"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "&Paus"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Lägg till överföring..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Sök och ersätt..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "Visa &filter"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Plats"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Är du säker på att du vill ta bort köade filer?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Är du säker på att du vill ta bort ALLA köade filer?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Att ladda en ny kö skriver över den befintliga. Är du säker på att du vill "
+"fortsätta?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Ladda kö"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Platssession [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Tråd %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "overksam"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "nerkopplad"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "ansluter"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "överför"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Status"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Det finns inga trådar som för närvarande kör."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Inga bokmärken."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Ny..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Byt namn"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "S&kapa delkategori..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "&Duplicera"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr "Ange användarnamn och lösenord för att ansluta till platsen."
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "Plats:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Kategorinamn"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Byt namn på kategori:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Nytt kategorinamn"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Ny kategori:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Ny server"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Ny server"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Är du säker på att du vill ta bort kategorin?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Är du säker på att du vill ta bort servern?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Kan inte ladda valt importinsticksprogram."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Den valda filen finns inte eller är inte läsbar."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Import av bokmärken är färdig."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Redigera..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL- och TLS-Inställningar"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "Importera..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Exportera..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP-bokmärkeseditor"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt> Du ska just exportera dina KFTPgrabber bokmärken. De kan innehålla "
+"lösenord eller känsliga X509-certifikat. Att exportera dina bokmärken kan "
+"äventyra deras säkerhet."
+"<br>"
+"<br>Är du säker?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Exportera bokmärken"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr "Kunde inte gå in i katalog %1."
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Avbryt"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "Vi&sa trädvy"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "Egenska&per"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "För&stör"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "&Filterinställningar"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr "Hoppa alltid ö&ver filen vid tillägg i kö"
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr "Låt filen få &högsta prioritet"
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr "Låt filen få &lägsta prioritet"
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "Över&föring"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Köa överföring"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "S&kapa katalog..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "Ö&ppna fil"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Verifiera..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Fler åtgärder"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "&Manuell kommandoinmatning..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Exportera kataloglistning..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "Visa &dolda filer och kataloger"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "Öppna aktuell katalog i &Konqueror..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "Jämför &markerade objekt"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "Jämför &kataloger"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "Skicka o&behandlat kommando"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "Ä&ndra plats"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Snabbanslutning..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "A&nslut till"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Koppla ner"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Ändra fjärr&kodning"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Vill du släppa aktuell anslutning?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Är du säker på att du vill FÖRSTÖRA filen?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Förstör fil"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+"Vill du verkligen ta bort objektet?\n"
+"Vill du verkligen ta bort alla %n objekten?"
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "Ta bort filer"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "Hoppa över '%1'"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "Prioritet '%1'"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Skapa katalog"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Katalognamn:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Skicka obehandlat kommando"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Kommando:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Exportera kataloglistning"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+"Identiska filer på båda sidor har dolts. Bara <b>olika filer</b> är nu synliga."
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "A&llmänt"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Fjärrkatalog"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Okänd"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Typ:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Plats:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Storlek:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Skapad:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "&Skydd"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "Åtkomstskydd"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Klass"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"Visa\n"
+"poster"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Läs"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"Skriv\n"
+"poster"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Skriv"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "Gå in i"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Kör"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Special"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Användare"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grupp"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Övriga"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "Sätt UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "Sätt GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Klistrig"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr "Verkställ ändringar för alla underkataloger och deras innehåll"
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Rotkatalog"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Sökväg: "
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Det här är en SSH-krypterad anslutning. Ingen certifikatinformation är för "
+"närvarande tillgänglig."
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "Filterinställningar"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "Filtrera kataloger"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "Filtrera symboliska länkar"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "Skiftlägeskänslig"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPgrabber</b> loggning initierad.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Kan inte öppna fil för skrivning."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Kan inte hitta XML-beskrivningsfilen för grafiskt gränssnitt %1. "
+"Kontrollera att du har installerat programmet riktigt. Om du har några frågor, "
+"ställ dem på %2."
+"<br>"
+"<br><b>Varning:</b> Nuvarande grafiskt gränssnitt kommer att vara "
+"ofullständigt.</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Att stänga huvudfönstret gör att KFTPgrabber fortsätter köra i "
+"systembrickan. Använd <b> Avsluta</b> i <b>KFTPgrabbers</b> "
+"meny för att avsluta programmet.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Docka i systembrickan"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr ""
+"Det finns för närvarande en pågående överföring.\n"
+"Det finns för närvarande %n pågående överföringar."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"Är du säker på att du vill avsluta?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "FTP-platser nära mig"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "Platser i Kwallet"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Redigera bokmärken..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "Laddar ner: %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Laddar upp: %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Kö"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Misslyckade överföringar"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Platser nära mig"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "Trådar"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Trafik"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopia av"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "Det här bokmärket är krypterat. Ange en nyckel för avkodning."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Avkodning av bokmärkesfil har misslyckats med den angivna nyckeln. Vill du "
+"<b>skriva över</b> bokmärken med en tom fil?"
+"<br>"
+"<br><font color=\"red\"><b>Varning:</b> Om du skriver över, går alla nuvarande "
+"bokmärken förlorade!</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Avkodning misslyckades"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "Skriv över b&okmärken"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Ange nyckel för kryptering av bokmärkesfilen."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Inga tjänster publicerade>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD inte tillgängligt>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<Inga platser i Kwallet>"
+
+#: _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 ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "&Visa"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "Fil&bläddrare"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Visa dolda &filer och kataloger"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "Visa &katalogträd"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr "Visa fil&storlekar i byte (växla för \"mänskligt läsbart\" format)"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Visa ä&gare och grupp för varje fil"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "Visa katalog&storlek"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "Andra &gränssnittselement"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, no-c-format
+msgid "Show left sidebar"
+msgstr "Visa vänster sidorad"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Kö sök och ersätt"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Genom att använda den här dialogrutan kan du göra stora ersättningar av käll- "
+"och målsökvägar för köade överföringar. <b>Ändringar kan inte ångras.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Sök efter vad"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Mål:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Källa:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Sök bara efter överföringar på en specifik server"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Serverinformation"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Servernamn:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Värddator:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Lösenord:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "Ersätt med"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Importguide för bokmärken"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Steg 1: <b>Välj insticksprogram för import</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Bild"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Välj lämpligt insticksprogram för import i listan nedan. Varje insticksprogram "
+"kan importera från ett specifikt format."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Tillgängliga insticksprogram för import:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Steg 2: <b>Välj bokmärkesfil att importera</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Välj bokmärkesfilen som du vill importera dina bokmärken från. En förvald "
+"sökväg har redan bestämts av insticksprogrammet för import."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Sökväg till bokmärken</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Steg 3: <b>Importerar bokmärken...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Vänta medan bokmärken importeras."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>Importförlopp</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Utseende"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Teckensnitt och färger"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Teckensnitt:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "Färg för klientkommandon:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Färg för serversvar:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Färg för flerraderssvar:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Färg för felmeddelanden:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Färg för statusmeddelanden:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "&Utmatning"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "&Filutmatning"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "&Spara logg i fil"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Utmatningsfil:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Källserverinformation"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Målserverinformation"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Källa:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Mål:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Överföringstyp:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "A&nslutning"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "Aktiv anslutnings IP-adress"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "T&vinga PORT/EPRT att använda inställd IP-adress"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP-address/värddatornamn:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr "&Ignorera extern IP-adress för anslutningar i lokalt nätverk"
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Aktiv anslutnings portintervall"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Använd &bara portar i det angivna portintervallet"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "Lägsta port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "Högsta port:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Tidsgränser"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Kontrollanslutningens tidsgräns (i sekunder):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Tidsgräns för dataöverföring (i sekunder):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Hastighetsgräns"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "Nerladdning (Kibyte/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Uppladdning (Kibyte/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Dis&kutrymme"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Kontroll av ledigt diskutrymme"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Stoppa överföring om det i&nte finns tillräckligt ledigt utrymme"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Intervall (sek):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "Minimalt ledigt utrymme (Mibyte):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "Tråd&ar"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Antal trådar per session:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr "Använd primär anslutning för överföringar"
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr "&Diverse"
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Försök automatiskt misslyckade överföringar igen"
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr "Maximalt antal försök innan markering som misslyckad:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Övrigt"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "&Köa filer (istället för överföra) vid \"drag och släpp\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "&Hoppa över tomma kataloger vid tillägg i kö"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "&Bekräfta nerkopplingar innan nerkoppling"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "FPT-platsegenskaper"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Datornamn:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokoll:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP via TLS/SSL (explicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP via TLS/SSL (implicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP via SSH2"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Platsetikett:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Fjärrkatalog:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Lokal katalog:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonym inloggning"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Avancerat"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "&Inaktivera användning av utökat passivt läge"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Inaktivera användning av passivt läge"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr "Använd platsens IP-adress för anslutningar med passivt läge"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+"Inaktivera \"tvinga aktivt läge för att använda IP-adress\" för platsen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Använd STAT för kataloglistningar"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Flera överföringstrådar"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Använd inte flera trådar för den här platsen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Serverkodning"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Kodning:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr "Försök igen och &håll-vid-liv"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Försök ansluta i&gen vid misslyckande"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Försök igen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Antal försök (0 = obegränsat)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Fördröjning innan försök igen:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr "Använd håll-vid-liv paket för att hålla anslutningen öppen"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr "Håll-vid-liv"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr "Håll-vid-liv frekvens (sekunder):"
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr "KFTPFilterEditorLayout"
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII-&filändelser"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Lägg till filändelse"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Filändelse:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Filändelse"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "Senaste anslutningar"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "Välj anslutning:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "Webbadress:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Skriv in hela webbadressen i rutan"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Skriv in värddatornamn för FTP"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "Anon&ym inloggning"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Kontrollera anonym inloggning"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Skriv in kontots användarnamn"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Skriv in kontots lösenord"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Lägg till &bokmärke"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Avancerat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "Inställningar av data-anslutning"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "Läge:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr "Kryptera alltid datakanalen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Kryptera bara för kataloglistningar"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr "Kryptera inte datakanalen"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509-certifikat"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Använd följande SSL-certifikat vid anslutning"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Sökväg:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-post&adress:"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "An&vänd e-postadress från inställningscentralen"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-post:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Start och avslutning"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Bekräfta &avslutning av programmet om det finns aktiva överföringar"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Starta programmet &minimerat i systembrickan"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Visa &startskärm vid start"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Visa ikon i s&ystembrickan"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr "Avsluta normalt när &X-knappen klickas"
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Förval för platser"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Kr&yptera bokmärkesfil"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "Visa platser från Kwallet bland &bokmärken"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Underrättelser"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Skärmmeddelanden"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "Visa &skärmmeddelande när överföringen blir färdig"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Visa bara när &kön är tom efter en överföring"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "Visa skärmmeddelande när &försök att ansluta igen lyckas"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Fil:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "ingen"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Fillista"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Obehandlad"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Ok"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Hittades inte"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Misslyckades"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Huvudfönstrets storlek"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Huvudfönstrets position på skärmen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Förvalt antal försök för nya platser."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Förvald tidsgräns för nya platser."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Ska ett skärmmeddelande visas när någon åtgärd är färdig."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Ska ett skärmmeddelande visas när alla köade överföringar är färdiga."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Ska ett skärmmeddelande visas när en anslutning till servern har upprättats med "
+"lyckat resultat efter att ha försökt igen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Ska användaren bekräfta avslutning om överföringar pågår."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Bokmärkesfilens krypteringsstatus."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Förvald lokal katalog."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Ska programmet avslutas när användaren klickar på X-knappen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Ska programmet startas minimerat."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Ska startskärmen visas när programmet startas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Ska ikonen i systembrickan visas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Ska platser från Kwallet visas bland bokmärken."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Ska dialogrutan \"Bekräfta nerkoppling\" visas varje gång en nerkoppling "
+"begärs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Förvalt platskodning."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr "Senaste platser med åtkomst via snabbanslutning."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr "En lista med filmönster där ASCII-läge ska användas vid överföring."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Ska tomma kataloger hoppas över."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Teckensnitt som ska användas för loggkomponenten."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Färgen på kommandon skickade till servern."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Färg för svaren från servern."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Färg för flerraderssvar från servern."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Färg för felmeddelanden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Färg för statusmeddelanden."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Ska loggen också skrivas till en fil."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Filen som loggen ska skrivas till."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+"Ska en port från ett angivet portintervallväljas för aktiva överföringar."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Portintervallets början."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Portintervallets slut."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Ska en IP-adress överskridas när aktiva överföringar utförs."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "IP-adressen att skicka när PORT-kommandot överskrids."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr "Ska extern IP-adress ignoreras för anslutningar i lokalt nätverk."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Ska överföringarna köas istället för startas när drag och släpp används."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Ska KFTPgrabber kontrollera ledigt utrymme och avbryta överföringen när det "
+"inte finns tillräckligt med ledigt utrymme.\t"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Intervall för diskkontroll."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "Minimalt ledigt utrymme (i Mibyte) som måste vara tillgängligt."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "Använd KDE:s allmänna e-postadress för anonyma lösenord."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "E-postadressen som ska användas för anonyma lösenord."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Antal trådar att använda vid överföring."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Ska den primära anslutningen användas för överföringar."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Tidsgräns (i sekunder) för kontrollanslutningen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Tidsgräns (i sekunder) för dataöverföringar."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Allmän hastighetsgräns för nerladdning (Kibyte/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Allmän hastighetsgräns för uppladdning (Kibyte/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr "Ska misslyckade överföringar automatiskt försökas igen."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr "Maximalt antal försök innan överföring markeras som misslyckad."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Ska katalogträdet normalt visas."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Ska dolda filer visas vid bläddring."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Ska filstorleken visas i byte istället för i \"mänskligt läsbar\" form."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Ska ägare och grupp visas för varje fil."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "Visa katalogstorlek."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "Visa vänster sidorad."
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Huvudmeny"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Bokmärkesverktygsrad"
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/kftpgrabber.po b/translations/tr/messages/kftpgrabber.po
new file mode 100644
index 0000000..4efdb63
--- /dev/null
+++ b/translations/tr/messages/kftpgrabber.po
@@ -0,0 +1,3638 @@
+# translation of kftpgrabber.po to Türkçe
+# translation of kftpgrabber.po to
+#
+# Görkem Çetin <gorkem@gorkemcetin.com>, 2005.
+# Adem Alp YILDIZ <ademalp@kde.org.tr>, 2005.
+# Server Acim <sacim@kde.org.tr>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber\n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-04-02 19:12+0300\n"
+"Last-Translator: Server Acim <sacim@kde.org.tr>\n"
+"Language-Team: Türkçe <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\n"
+"X-Poedit-Language: Turkish\n"
+"X-Poedit-Country: TURKEY\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+#, fuzzy
+msgid "contains"
+msgstr "bağlanıyor"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "Dizin"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr ""
+
+#: src/misc/filterwidgethandler.cpp:389
+#, fuzzy
+msgid "Priority:"
+msgstr "Öncelik"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "Karşıdan İndir"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "Karşıya Yükle"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "Dosyaadı"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr ""
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "Boyut"
+
+#: src/misc/filter.cpp:223
+#, fuzzy
+msgid "Change priority"
+msgstr "&Siteyi Değiştir"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr ""
+
+#: src/misc/filter.cpp:227
+#, fuzzy
+msgid "Lowercase destination"
+msgstr "Hedef"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr ""
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP içe aktarımı"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber içe aktarımı"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp içe aktarımı"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr ""
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "Kuyruktaki tüm aktarımlar tamamlandı."
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "Dosya Var"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber-KDE için bir FTP istemcisi"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "Baş geliştirici"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "Geliştirici"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH kodu"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc kodu"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon popup kodu"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "Görsel trafik parçacığı"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "Simge tasarımı"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "Sınama ve hata ayıklama"
+
+#: src/main.cpp:74
+#, fuzzy
+msgid "Directory parser code"
+msgstr "Dizin Adı:"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "Aşağıdaki dosyaların aktarımı tamamlandı:"
+
+#: src/kftptransferfile.cpp:223
+#, fuzzy
+msgid "Connection to the server has failed."
+msgstr "%1'e bağlanmak başarısız."
+
+#: src/kftptransferfile.cpp:227
+#, fuzzy
+msgid "Login to the server has failed"
+msgstr "Dosya aktarımı başarısızlıkla sonuçlandı."
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "Kaynak dosyası bulunamadı."
+
+#: src/kftptransferfile.cpp:235
+#, fuzzy
+msgid "Permission was denied."
+msgstr "İzinler"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "Dosyayı yazmak için açmak olanaksız."
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr ""
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr ""
+"Aşağıdaki dosyaların aktarımı <b>durduruldu</b> çünkü '%1'üzerinde yeterli disk "
+"alanı yok:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "SSH bağlantısını (%1) kurmak olanaksız."
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "Oturum açılıyor..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+#, fuzzy
+msgid "Login has failed."
+msgstr "Oturum açılamadı."
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr ""
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "STFP kanalını kurmak olanaksız."
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "SFTP'yi sıfırlamak olanaksız."
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+#, fuzzy
+msgid "Connected."
+msgstr "bağlantı kesildi"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "Bağlantı kuruluyor..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+#, fuzzy
+msgid "Connecting to %1:%2..."
+msgstr "%1:%2 'e bağlanıyor..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+#, fuzzy
+msgid "Aborted."
+msgstr "&Durdur"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "Ön bellekteki dizin listesini kullanıyor."
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "Dizin listesi getiriliyor..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+#, fuzzy
+msgid "Transfering..."
+msgstr "Aktarıyor..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+#, fuzzy
+msgid "Removing..."
+msgstr "Dizinleri kaldırıyor..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:297
+#, fuzzy
+msgid "Connection has failed."
+msgstr "%1'e bağlanmak başarısız."
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+#, fuzzy
+msgid "Failed to connect (%1)"
+msgstr "Bağlanmak olanaksız."
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+#, fuzzy
+msgid "Establishing data connection with %1:%2..."
+msgstr "Yeniden bağlanmayı deniyor (%1/%2)..."
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+#, fuzzy
+msgid "Unable to establish a listening socket."
+msgstr "TLS bağlantısını kurmak olanaksız."
+
+#: src/engine/ftpsocket.cpp:993
+#, fuzzy
+msgid "Waiting for data connection on port %1..."
+msgstr "Bağlantı kurulması bekleniyor..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+#, fuzzy
+msgid "Data connection established."
+msgstr "Bağlantı kuruldu."
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+#, fuzzy
+msgid "Transfer completed."
+msgstr "FXP aktarımı tamamlandı."
+
+#: src/engine/ftpsocket.cpp:2113
+#, fuzzy
+msgid "Making directory..."
+msgstr "Dizinleri tarıyor..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+#, fuzzy
+msgid "Transfering file '%1'..."
+msgstr "Aktarıyor..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+#, fuzzy
+msgid "Disconnected."
+msgstr "bağlantı kesildi"
+
+#: src/engine/socket.cpp:192
+#, fuzzy
+msgid "Connection timed out."
+msgstr "%1'e bağlanmak başarısız."
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "Boşta"
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+#, fuzzy
+msgid "Scan complete."
+msgstr "Doğrulama tamamlandı!"
+
+#: src/engine/socket.cpp:567
+#, fuzzy
+msgid "Starting recursive directory scan..."
+msgstr "Dizin listesi getiriliyor..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "Tekrar bağlanmadan önce %1 saniye bekliyor..."
+
+#: src/engine/connectionretry.cpp:67
+#, fuzzy
+msgid "Waiting..."
+msgstr "Bağlantı kuruluyor..."
+
+#: src/engine/connectionretry.cpp:76
+#, fuzzy
+msgid "Retrying connection (%1/%2)..."
+msgstr "Yeniden bağlanmayı deniyor..."
+
+#: src/engine/connectionretry.cpp:78
+#, fuzzy
+msgid "Retrying connection..."
+msgstr "Yeniden bağlanmayı deniyor..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "Yeniden deneme durduruldu."
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "Dosyada Eylemler (%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "Boyut/Zaman damgası"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "Aynı"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "Daha eski"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "Daha yeni"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "Daha küçük"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "Daha büyük"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "Atla"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "Üzerine yaz"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "Sürdür"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "Yeniden Adlandır"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "Sor"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "Günlük (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "Yerel Oturum"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "Günlük"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "%1 ile bağlantı başarıyla kuruldu."
+
+#: src/kftpsession.cpp:388
+msgid "Please provide your private key decryption password."
+msgstr "Lütfen özel anahtar çözücü şifrenizi edinin."
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "Oturum"
+
+#: src/kftpsession.cpp:900
+msgid "At least one session must remain open on each side."
+msgstr "Her iki yanda da en az bir oturum açılmış olmalıdır."
+
+#: src/kftpsession.cpp:905
+msgid "Please finish all transfers before closing the session."
+msgstr "Oturumu kapatmadan önce tüm aktarımları lütfen tamamlayın."
+
+#: src/kftpsession.cpp:910
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr ""
+"Bu oturumda bir bağlantı kurulmuş durumda. Bağlantıyı kesmek istediğinizden "
+"emin misiniz?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "Oturumu Kapat"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "Hızlı & Bağlan"
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "&Yeni Oturum"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "&Sol Taraf"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "&Sağ Taraf"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "&Aktarım Kipi (Otomatik)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "İkili"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "Otomatik"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "&Aktarım Kipi (ASCII)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "&Aktarım Kipi (İkili)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "Seç..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "İsimsiz"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "Aktarım"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "Tanım"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "Başarısız aktarım yok."
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "&Aktarıma Yeniden Başla"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "&Kuyruğa Ekle"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "Hepsini Kuyruğa Ekle"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "K&aldır"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "Hepsini Kaldır"
+
+#: src/widgets/failedtransfers.cpp:180
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "Bu başarısız aktarımı kaldırmak istediğinizden emin misiniz?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "Bütün başarısız aktarımları kaldırmak istediğinizden emin misiniz?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Biçim1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "Yeni Örüntü"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "Dosyaadı örüntüsü:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "Renk:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "Hızlı Bağlan"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "bir sunucuadı"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "bir geçerli kapı"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "kullunıcı adınız"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "şifreniz"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr "ve"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "Lütfen giriniz"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "Litfen X509 sertifika şifre çözücü şifrenizi temin ediniz."
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "Size Yakın Siteler"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "Yayınlanmış hiç site yok."
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "Örüntü"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "Renk"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "Örüntü ekleyin"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "Etkinleştirilmiş"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "Vurgulama"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>Henüz gerçekleştirilmemiş.</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "Listeyi Atla"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII uzantıları"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "Genel"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "Aktarımlar"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "Görünüm"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "Eylemler"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "Süzgeçler:"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr "Sağlama doğrulayıcısı"
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "Sağlama"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "Doğrulama tamamlandı!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr "Doğrulama dosyasını açmak olanaksız veya dosya yanlış biçimde!"
+
+#: src/widgets/filtereditor.cpp:67
+#, fuzzy
+msgid "Filter &enabled"
+msgstr "Dosyaadı"
+
+#: src/widgets/filtereditor.cpp:136
+#, fuzzy
+msgid "No filters."
+msgstr "Süzgeçler:"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:155
+#, fuzzy
+msgid "Down"
+msgstr "Karşıdan İndir"
+
+#: src/widgets/filtereditor.cpp:173
+#, fuzzy
+msgid "Rename..."
+msgstr "Yeniden Adlandır"
+
+#: src/widgets/filtereditor.cpp:175
+#, fuzzy
+msgid "New"
+msgstr "Daha yeni"
+
+#: src/widgets/filtereditor.cpp:266
+#, fuzzy
+msgid "Rename Rule"
+msgstr "Yeniden Adlandır"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+#, fuzzy
+msgid "Conditions"
+msgstr "&Bağlantı"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "Bul & Yerine Koy"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "Bant genişliği kullanımı"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr ""
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "yüklendi"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "sürüyor"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "Bağlantı kurulması bekleniyor..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "Süzgeç:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "İsim"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "Kaynak"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "Hedef"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "Durum"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "Hız"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "ETA"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "Kuyrukta hiç dosyanız yok."
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "Karşıdan İndir"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+msgid "Up: "
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "İş Parçacıkları"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "Ak&tarımı Başlat"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "&Aktarımı Durdur"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "Tümünü &Sil"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "Y&ukarı Taşı"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "Aşağı &Taşı"
+
+#: src/widgets/queueview/queueview.cpp:563
+#, fuzzy
+msgid "Move To &Top"
+msgstr "Y&ukarı Taşı"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "Aktarım &Bilgisini Değiştir"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "&Dosyadan Kuyruğu Yükle"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "&Kuyruğu Dosyaya Kaydet"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "Başla&t"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "Ara &Ver"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "&Aktarım Ekle..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "&Bul ve Değiştir"
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "&Süzgeci Göster:"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "Site"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "Kuyruktakı dosya veya dosyaları kaldırmak istediğinizden emin misiniz?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "Kuyruktakı bütün dosyaları kaldırmak istediğinizden emin misiniz?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr ""
+"Yeni kuyruk yüklemek varolun üzerine yazacaktır; devam etmek istediğinize emin "
+"misiniz?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "Kuyruğu Yükle"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "Site oturumu [%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "Parçacık %1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "boşta"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "bağlantı kesildi"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "bağlanıyor"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "aktarıyor"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP- [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "Durum"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "Şu anda süren hiç parçacık yok."
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "Yerimi yok."
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "&Yeni..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "&Yeniden Adlandır"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "&Altkategori Yarat"
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "Ç&oğalt"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+#, fuzzy
+msgid "Site:"
+msgstr "Site"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "Kategori Adı"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "Kategoriyi yeniden adlandır:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "Yeni Kategori Adı"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "Yeni kategori:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "Yeni sunucu"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "Yeni Sunucu"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "Bu kategoriyi kaldırmak istediğinizden emin misiniz?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "Bu sunucuyu kaldırmak istediğinizden emin misiniz?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "Seçili içe aktarılan eklentiyi yüklemesi olanaksız."
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "Seçili dosya yer almamakta veya okunamaz durumdadır."
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "Yerimi içe aktarımı tamamlandı."
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "&Düzenle..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS Ayarları"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "İçe aktar..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "Dışa Aktar..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP Yerimi Düzenleyicisi"
+
+#: src/widgets/bookmarks/editor.cpp:197
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>KFTPGrabber yerimlerinizi dışa aktarmak üzeresiniz. . Onlar şifre veya "
+"duyarlı X509 sertifikaları içerebilirler. Yerimlerinizi dışa aktarmak onların "
+"güvenliğini tehlikeye atabilir."
+"<br>"
+"<br>Emin misiniz?</qt> "
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "Yerimlerini Dışa Aktar"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "&Durdur"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "&Ağaç Görünümü Göster"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "Ö&zellikler"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "&Parçacık"
+
+#: src/widgets/browser/actions.cpp:116
+#, fuzzy
+msgid "&Filter Options"
+msgstr "Süzgeçler:"
+
+#: src/widgets/browser/actions.cpp:117
+#, fuzzy
+msgid "Always &skip this file when queuing"
+msgstr "Kuyruğa eklerken önceliği olan dosyaların listesi."
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "&Aktar"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "&Kuyruk Aktarımı"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "&Dizin Yarat"
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "&Dosyayı Aç"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "&Doğrula"
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "&Daha Fazla Eylem"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "&Dizin Listesini Dışa Aktar..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "&Saklı Dosya ve Dizinleri Göster"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:140
+#, fuzzy
+msgid "Compare &directories"
+msgstr "Dizin Yarat"
+
+#: src/widgets/browser/actions.cpp:144
+#, fuzzy
+msgid "Send &Raw Command"
+msgstr "Ham Komutu Gönder"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "&Siteyi Değiştir"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "&Hızlı Bağlan..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "Ş&una Bağlan"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "&Bağlantıyı Kes"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "Uzaktan Kodlamayı &Değiştir"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "Şu anki bağlantıyı koparmak istiyor musunuz?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "Bu dosyayı kırpmak istediğinizden emin misiniz?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "Dosyayı Kırp"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+#, fuzzy
+msgid "Delete Files"
+msgstr ":Dosyayı Sil"
+
+#: src/widgets/browser/actions.cpp:452
+#, fuzzy
+msgid "Skip '%1'"
+msgstr "Atla"
+
+#: src/widgets/browser/actions.cpp:456
+#, fuzzy
+msgid "Priority '%1'"
+msgstr "Öncelik"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "Dizin Yarat"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "Dizin Adı:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "Ham Komutu Gönder"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "Komut:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "Dizin Listesini Dışa Aktar"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "&Genel"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "Uzak klasör"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "Bilinmeyen"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "Tür:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "Yer:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "Boyut:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "Yaratılmış:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "İ&zinler"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "İzinlere Eriş"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "Sınıf"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "Oku"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "Yaz"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr ""
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "Uygula"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "Özel"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "Kullanıcı"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "Grup"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "Diğerleri"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "UID Ayarla"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "GID Ayarla"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "Yapışkan"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "Kök dizini"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "Yol"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr ""
+"Bu bir SSH şifreli bağlantıdır. Şu anda hiçbir sertifika bilgisi hazır "
+"değildir."
+
+#: src/widgets/browser/filterwidget.cpp:88
+#, fuzzy
+msgid "Filter Options"
+msgstr "Süzgeçler:"
+
+#: src/widgets/browser/filterwidget.cpp:90
+#, fuzzy
+msgid "Filter Directories"
+msgstr "Dizin Yarat"
+
+#: src/widgets/browser/filterwidget.cpp:93
+#, fuzzy
+msgid "Filter Symlinks"
+msgstr "Dosya listesi"
+
+#: src/widgets/browser/filterwidget.cpp:96
+#, fuzzy
+msgid "Case Sensitive"
+msgstr "&Siteyi Değiştir"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber</b> oturumcusu sıfırlandı.<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "Dosyayı yazmak için açmak olanaksız."
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+"<qt>Tanımlayıcı %1 XML GUI dosyasını bulmak olanaksız..Uygulamayı doğru kurup "
+"kurmadığınızı lütfen kontrol edin! Eğer sorularınız varsa %2 buraya sorun."
+"<br>"
+"<br><b>Uyarı:</b> Şu andaki GUI tamamlanmamış olacak!</qt>"
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>Ana pencereyi kapamak KFTPGrabber'in sistem tepsisinde çalışmaya devam "
+"etmesini sağlayacaktır.Menüden <b>Çık komutunu </b> kullanırsanız <b>"
+"KFTPGrabber</b> uygulaması kapanacaktır.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "Sistem Tepsisine küçültme"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr "Şu anda süren %n aktarımlar."
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "Bana Yakın FTP Siteleri"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "KWallet'daki Siteler"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "Yerimlerini Düzenle..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "İndirme %1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "Yükleme %1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "Kuyruk"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "Başarısız Aktarımlar"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "Bana Yakın Siteler"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "İş Parçacıkları"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "Trafik"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "Kopyası"
+
+#: src/kftpbookmarks.cpp:307
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr ""
+"Bu yer imi dosyası şifrelenmiştir. Lütfen şifreyi çözmek için anahtar şifreyi "
+"giriniz."
+
+#: src/kftpbookmarks.cpp:326
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>Yer imi dosyasının sağlanan anahtar şifre ile şifre çözümü başarılamadı. "
+"Yer imlerini <b>boş bir dosya ile</b> üzerine yazmak ister misiniz?"
+"<br>"
+"<br><font color=\"red\"><b>Uyarı:</b> Eğer üzerine yazarsanız şu anki yer "
+"imlerini kaybedeceksiniz.</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "Şifre Çözümü Başarılamadı"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "&Yer İmlerini Üzerine Yaz"
+
+#: src/kftpbookmarks.cpp:386
+msgid "Enter key for bookmark file encryption."
+msgstr "Yer imleri dosyasını şifrelemek için anahtarı giriniz."
+
+#: src/kftpbookmarks.cpp:825
+msgid "<No Services Published>"
+msgstr "<Hiçbir Hizmet Yayımlanmadı>"
+
+#: src/kftpbookmarks.cpp:830
+msgid "<DNSSD Not Available>"
+msgstr "<DNSSD Kullanılamaz>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr "<KWallet'de Hiç Site Yok>"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Adem Alp YILDIZ Server ACİM"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "ademalp@kde.org.tr sacim@kde.org.tr"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "Görü&ntü"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "&Dosya Tarayıcısı"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "Gizli &dosyaları ve dizinleri göster"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "&Dizin ağacını göster"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+"Dosya &boyutlarını bayt boyutunda göster (bağlanacak format \"kolayca "
+"okunabilir\")"
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "Her &dosya için sahibi ve grubunu göster"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, fuzzy, no-c-format
+msgid "Show directory &size"
+msgstr "&Dizin ağacını göster"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "&Süzgeci Göster:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "Ara & Değiştiri Kuyruğa Ekle"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr ""
+"Bu iletiyi kullanarak kuyruğa eklenmiş aktarımların kaynak/hedef yollarında "
+"büyük yer değişimleri yapabilirsiniz.. <b>Değişiklikler geri alınamaz.</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "Ne Araştırılacak"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "Hedef:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "Kaynak:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "Sadece özel sunuculardaki aktarımları araştır"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "Sunucu Bilgisi"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "Sunucu adı:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "Sunucu:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "Şifre:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "İle Değiştir"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "Yerimi İçe Aktarım Sihirbazı"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "Adım 1: <b> İçe Aktarım Eklentisi Seç</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "Resim"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr ""
+"Aşağıdaki listeden lütfen uygun içe aktarım eklentisini seçiniz. Her bir "
+"eklenti farklı bir biçimde içe aktarabilir."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "Kullanılabilir içe aktarım eklentileri:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "Adım 2: <b>İçe Aktarılacak Yer İmi Dosyasını Seçin</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr ""
+"Lütfen yer imlerinizi içe almak istediğiniz yer imi dosyasını seçin. Bir "
+"varsayılan yol, zaten içe aktarma eklentisi tarafından belirlenmiştir."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>Yerimi yolu:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "Adım 3: <b>Yer İmlerini İçe Aktarım...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "Yer imleri içeri aktarılırken lütfen bekleyin."
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>İçe aktarım durumu:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "&Görünüm"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "Yazıtipi ve Renkler"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "Yazıtipi:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "İstemci komut rengi:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "Sunucu yanıt rengi:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "Çoksatırlı yanıt rengi:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "Hata iletisi rengi:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "Durum iletisi rengi:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "Çık&tı"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "Çıktı &Dosyası"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, no-c-format
+msgid "&Save log to file"
+msgstr "Kaydedilecek günlük dosyası"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "Çıktı dosyası:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "Kaynak Sunucu Bilgisi"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "Hedef Sunucu Bilgisi"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>Kaynak:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>Hedef:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "Aktarım türü:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "&Bağlantı"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, no-c-format
+msgid "Active Connection IP"
+msgstr "Etkin Bağlantı IP'si"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "PORT/EPRT yi yapılandırılmış IP'yi kullanmaya zorlayın"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, no-c-format
+msgid "IP/hostname:"
+msgstr "IP/sunucu adı"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, no-c-format
+msgid "Active Connection Port Range"
+msgstr "Etkin Bağlantı Kapı Erimi"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr "Sa&dece belirlenmiş kapı erimini kullan"
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr "En az kapı:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr "En çok kapı:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "Zaman aşımları"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr "Saniye bazında denetim bağlantısı zaman aşımı:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr "Veri aktarım zaman aşımı (saniye bazında):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "Hız sınırı"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "İndirme (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "Yükleme (KB/s):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "Dis&k Boşluğu"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "Boş Disk Alanı Denetimi"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "Eğer &yeterli boşluk yoksa aktarımı durdur"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, no-c-format
+msgid "Interval (sec):"
+msgstr "Aralık (saniye):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "En az boş alan (MiB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "&Dizimler"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "Oturum başına dizim sayısı:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr "Başarısız aktarım yok."
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "Diğer"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr "Kuyruk dosyaları (aktarım yerine) \"sürüklenip & & bırakıldığında\""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "&Boş dizinleri atla"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "Bağlantıyı koparmadan önce &bağlantıdan ayrılmayı onayla"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, no-c-format
+msgid "ftpSiteProperties"
+msgstr "ftpSiteÖzellikleri"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "Sunucu:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "Protokol:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "FTP; TSL/SSL(belirgin) üzerinden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "FTP; TSL/SSL(belirsiz) üzerinden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "SFTP; SSH2 üzerinden"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "Site etiketi:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "Sunucu dizini:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "Yerel dizin:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, no-c-format
+msgid "&Anonymous login"
+msgstr "&Anonim giriş"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, no-c-format
+msgid "&Advanced"
+msgstr "&Gelişmiş"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "Uzatılmış edilgen kipin &kullanımını etkisizleştir"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "Edilgen kipin kullanımını etkisizleştir"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "Dizin listelemesi için STAT kullan"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "Çoklu Aktarım İş Parçacığı"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "Bu site için çoklu aktarım iş parçacıklarını kullanma"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "Sunucu Şifrelemesi"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "Şifreleme:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "Bozuk bağlantıyı &tekrar kurmayı dene"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "Tekrarla"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "Tekrarlama sayısı (0 = sınırsız)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "Tekrarlama aralığı:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII &Eklentileri"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "Eklenti Ekle"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "Eklenti:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "Eklenti"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "Recent connections"
+msgstr "Yeniden bağlanmayı deniyor..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "Select connection:"
+msgstr "Yeniden bağlanmayı deniyor..."
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "Adres:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "Tek parça adresleri bu kutuya girin"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "Ftp'nin sunucu adını girin"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "&Anonim giriş"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "Anonim girişi denetle"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "Hesabın kullanıcı adını girin"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "Hesabın şifresini girin"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "Yerimlerine &ekle"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "Gelişmiş"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, fuzzy, no-c-format
+msgid "Data Connection Settings"
+msgstr "Bağlantı kuruldu."
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "Dizin listelemesi için STAT kullan"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 Sertifikası"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "Bağlanılıyorken belirtilen SSL sertifikasını kullan"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "Yol:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "E-posta &Adresi"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "E-posta adresini kontrol merkezinden al"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "E-Posta:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "Başla ve Çık"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "Programı &kapatırken etkin dosya aktarımı varsa onay iste"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "Programı sistem çekmecesine küçültülmüş olarak başlat"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "Açılışta başlangıç penceresini gö&ster"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "Sistem tepsisi &simgesini göster"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, no-c-format
+msgid "Site Defaults"
+msgstr "Site Varsayılanları"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "Yer imi &dosyasını şifrele"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr "&Yer imleri arasından KWallet'te yer alan siteleri göster"
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, no-c-format
+msgid "&Notification"
+msgstr "&Uyarı"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr "Balonlar"
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "&Aktarım tamamlandığında balonu göster"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "Sadece &aktarımdan sonra kuyruk boş ise göster"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "&Yeniden bağlanma denemesi başarılırsa balonu göster"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>Dosya:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr "hiçbiri"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, no-c-format
+msgid "File list"
+msgstr "Dosya listesi"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr "Gerçekleştirilmemiş"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr "Tamam"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr "Bulunamadı"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, no-c-format
+msgid "Failed"
+msgstr "Başarılamadı"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr "Ana pencerenin boyutu."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr "Ekrandaki ana pencerenin durumu."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr "Yeni siteler için varsayılan yeniden deneme sayısı"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr "Yeni siteler için varsayılan yeniden deneme gecikmesi"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "Bazı işler tamamlandığında bir balon görüntülenmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "Kuyruktaki tüm aktarımlar tamamlandığında bir balon görüntülenmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+"Yeniden deneme sonrası sunucuyla bağlantı başarıyla sağlandığında bir balon "
+"görüntülenmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "Eğer süren aktarımlar varsa kullanıcı onayı işleminden çıkmalı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "Yer imleri dosyasının şifrelenme durumu."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, no-c-format
+msgid "Default local directory."
+msgstr "Varsayılan yerel dizin."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, fuzzy, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr "Başlatılan uygulama küçültülmelidir."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr "Başlatılan uygulama küçültülmelidir."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr "Uygulama başlarken giriş ekranı görüntülenmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "Sistem tepsisi simgesi görüntüleniyor olmalı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr "Yer imleri arasında KWallet'e kayıtlı siteler gösteriliyor olmalı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+"Bağlantıyı kes isteği her seferinde geldiğinde \"bağlantı kesmeyi onayla\" "
+"ekranı görüntülenmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr "Varsayılan site şifrelemesi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+"Aktarım için ASCII kipinin kullanılacağı zamanlardaki dosya örüntü listesi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "Boş dizinlerin atlanması gereklidir."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr "Font giriş parçacığı için kullanılmalıdır."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "Sunucuya gönderilmiş olan komutlarına rengi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr "Sunucudan gelen cevapların rengi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr "Sunucudan gelen çoklu cevapların rengi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr "Hata iletilerinin rengi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr "Durum iletilerinin rengi."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr "Giriş bile bir dosyaya yazılmalı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr "Girişin yazılacağı dosya."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr "Etkin aktarımlarda özel bir kapı eriminden bir kapı seçilmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr "Kapı eriminin başlangıcı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr "Kapı eriminin sonu."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr "Etkin aktarım sırasında eski bir IP geçersiz kılınmış olur."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr "PORT komutu geçersiz kılınırken IP gönderilmiş olur."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+"Sürükle ve bırak kullanılırken aktarımlara başlamak yerine sıraya konulmalıdır."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+"Kftpgrabber boş yeri denetlemeli ve diskte yeterli boş yer yoksa aktarımı "
+"durdurmalıdır."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr "Disk denetimi için aralık."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr "En az boş yer (MB bazında) yeterli olmalı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr "isimsiz şifreler için küreler KDE e-posta adresini kullan."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr "İsimsiz şifreler için e-posta adresi kullanılmalıdır."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "Aktarım sırasındaki iş parçacıklarının sayısı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "Eğer süren aktarımlar varsa kullanıcı onayı işleminden çıkmalı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr "Denetim bağlantısı için saniye bazında zaman aşımı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr "Veri aktarımları için saniye bazında zaman aşımı."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr "Küresel indirme hız sınırı (kbytes/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr "Küresel yükleme hız sınırı (kbytes/s)."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr "Dizin ağacı varsayılan olarak gösterilmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr "Gezinirken gizli dosyalar gösterilmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+"Dosya büyüklüğü \"sıradan\" biçimde gösterilmek yerine bit biçiminde "
+"gösterilmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr "Her dosya için sahibi ve grubu bilgileri görüntülenebilmeli."
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, fuzzy, no-c-format
+msgid "Show directory size."
+msgstr "&Dizin ağacını göster"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, fuzzy, no-c-format
+msgid "Show left sidebar."
+msgstr "&Süzgeci Göster:"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "Ana Menü"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "Yerimi Araç Çubuğu"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "%1 için hiç kullanıcı adı belirlenmemiş."
+
+#~ msgid "Error Connecting"
+#~ msgstr "Bağlantıda Hata"
+
+#, fuzzy
+#~ msgid "DisplaySettings"
+#~ msgstr "Görünüm"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+S"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "Hızlı Bağlan"
+
+#~ msgid "Unable to find a suitable application to open this file!"
+#~ msgstr "Bu dosyayı açmak için gerekli olan uygun bir uygulama bulmak olanaksız!"
+
+#~ msgid "Webpage design"
+#~ msgstr "Web sayfası tasarımı"
+
+#~ msgid "Command"
+#~ msgstr "Komut "
+
+#~ msgid "What's this?"
+#~ msgstr "Bu nedir?"
+
+#~ msgid "Server Management"
+#~ msgstr "Sunucu Yönetimi"
+
+#~ msgid "Download: %1 MB Upload: %2 MB<br>Credits: %3 MB Ratio: %4"
+#~ msgstr "İndirme: %1 MB Yükleme: %2 MB<br>Puanlar: %3 MB Oran: %4"
+
+#~ msgid "Site Command Dialog"
+#~ msgstr "Site Komut Penceresi"
+
+#~ msgid "Username"
+#~ msgstr "Kullanıcı Adı"
+
+#~ msgid "Enter a username or press cancel"
+#~ msgstr "Bir kullanıcı adı girin veya iptal'e basın"
+
+#~ msgid "Group name"
+#~ msgstr "Grup adı"
+
+#~ msgid "Enter a group or press cancel"
+#~ msgstr "Bir grup girin veya iptal'e basın"
+
+#~ msgid "Description name"
+#~ msgstr "Tanım ismi"
+
+#~ msgid "Enter a description or press cancel"
+#~ msgstr "Bir tanım girin veya iptal'e basın"
+
+#~ msgid "Passwords do not match"
+#~ msgstr "Şifreler uyuşmuyor"
+
+#~ msgid "Optional"
+#~ msgstr "Seçimlik"
+
+#~ msgid "Password retype:"
+#~ msgstr "Şifre yeniden:"
+
+#~ msgid "Send &Raw Command..."
+#~ msgstr "Ham Komutu &Gönder..."
+
+#~ msgid "Display your idle time"
+#~ msgstr "Boşta kaldığınız zamanı görüntüleyin"
+
+#~ msgid "Set your idle-time (per-session only)"
+#~ msgstr "Boşta kaldığınız zamanı ayarlayın (sadece oturum-başına)"
+
+#~ msgid "Set your idle-time (per-session only).<br>This sets your idle-time (the amount of time you can be online without<br>doing something). Max idle-time is 7200 sec.<br>"
+#~ msgstr "Boşta kaldığınız zamanı ayarlayın(sadece oturum-başına)<br>Bu sizin boşta kaldığınız zamanı ayarlar (bir sizin işlem yapmadan <br>bağlı kaldığınız zaman dilimi). En fazla boşta zaman süresi 7200 saniyedir.<br>"
+
+#~ msgid "This will change your password"
+#~ msgstr "Bu sizin şifrenizi değiştirecek"
+
+#~ msgid "This will change your password.<br>Passwords can only be 8 characters long."
+#~ msgstr "Bu sizin şifrenizi değiştirecek.<br>Şifreler en fazla 8 karakter uzunluğunda olabilir."
+
+#~ msgid "Display the group info"
+#~ msgstr "Grup bilgisini görüntüle"
+
+#~ msgid "Display the group info<br>"
+#~ msgstr "Grup bilgisini görüntüle<br>"
+
+#~ msgid "Show current aliases"
+#~ msgstr "Geçerli rumuzları göster"
+
+#~ msgid "Show current cdpaths"
+#~ msgstr "Geçerli cd yollarını göster"
+
+#~ msgid "Show current glftpd version"
+#~ msgstr "Geçerli glftpd sürümünü göster"
+
+#~ msgid "Show current glftpd version<br>"
+#~ msgstr "Geçerli glftpd sürümünü göster<br>"
+
+#~ msgid "Display users currently online"
+#~ msgstr "Şu anda bağlı kullanıcıları görüntüle"
+
+#~ msgid "Display users currently online<br>"
+#~ msgstr "Şu anda bağlı kullanıcıları görüntüle<br>"
+
+#~ msgid "Display the welcome screen"
+#~ msgstr "Hoş geldiniz ekranını görüntüle"
+
+#~ msgid "Display the welcome screen<br>"
+#~ msgstr "Hoş geldiniz ekranını görüntüle<br>"
+
+#~ msgid "Display current time on the site"
+#~ msgstr "Sitedeki şu andaki zamanı görüntüle"
+
+#~ msgid "Display current time on the site<br>"
+#~ msgstr "Sitedeki şu andaki zamanı görüntüle<br>"
+
+#~ msgid "Display recently unnuked releases"
+#~ msgstr "En son bozulmamış yayımları görüntüle"
+
+#~ msgid "Display recently unnuked releases<br>"
+#~ msgstr "En son bozulmamış yayımları görüntüle<br>"
+
+#~ msgid "Delete a user, may be readded with site READD"
+#~ msgstr "Bir kullanıcı sil, READD sitesi ile yeniden eklenmiş olabilirler"
+
+#~ msgid "Delete a user, may be readded with site READD<br><br><i>Example:</i> site deluser Archimede<br><br>This will activate the flag DELETED (6) for the user 'Archimede'.<br>In order to fully delete this user you will need to do a 'site purge'<br>"
+#~ msgstr "Bir kullanıcı sil, READD site ile yeniden eklenmiş olabilirler<br><br><i>Örnek:</i> site deluser Archimede<br><br>Bu Archimede kullanıcısının bayrağını SİLİNMİŞ (6) olarak etkinleştirecektir.<br>Bu kullanıcıyı tamamen silmek yerine 'site temizle' komutunu kullanmaya gerek duyabilirsiniz.<br>"
+
+#~ msgid "Change user's password"
+#~ msgstr "Kullanıcının şifresini değiştir"
+
+#~ msgid "Change user's password<br><i>Example:</i> site chpass Archimede newpassword<br>This would change the password to 'newpassword' for the<br>user 'Archimede'.<br><br>See \"site passwd\" for more info if you get a Password is not secure<br>enough error.<br><br>* Denotes any password, <i>Example:</i> site chpass arch *<br>This will allow arch to login with any password<br><br>@ Denotes any email-like password, <i>Example:</i> site chpass arch @<br>This will allow arch to login with a@b.com but not ab.com<br>"
+#~ msgstr "Kullanıcının şifresini değiştir<br><i>Örnek:</i> site chpass Archimede newpassword<br>Bu şifreyi 'yeni şifre'ye dönüştürecektir tabii ki<br>'Archimede'.kullanıcısı için.<br><br>Eğer güvenlikli olmayan bir Şifre aldıysanız daha fazla bilgi için \"site passwd\" a bakınız<br>Eğer hatalıysa.<br><br>* Herhangi bir şifreyi gösterir. <i>Örnek:</i> site chpass arch *<br>Bu sisteme herhangi bir şifreyle girmeye izin verir<br><br>@ email-gibi şifreyi gösterir, <i>Örnek:</i> site chpass arch @<br>Bu sisteme a@b.com girmeye izin verecek ama ab.com ile girmeye izin vermeyecektir<br>"
+
+#~ msgid "Toggle the user's gadmin status for the given group"
+#~ msgstr "Kullanıcının verilmiş grup için gadmin durumunu değiştir"
+
+#~ msgid "Toggle the user's gadmin status for the given group<br><b>NOTE:</b> When a user becomes a gadmin they will automatically get<br>flag 2 added. When a user stops to become a gadmin of<br>any of their groups the gadmin flag will be automatically<br>removed.<br>"
+#~ msgstr "Kullanıcının verilmiş grup için gadmin durumunu değiştir<br><b>DİKKAT:</b> Bir kullanıcı gadmin olduğunda otomatik olarak<br>bayrak 2 eklenir. Bir kullanıcı bir grubun gadmini olmaktan vazgeçerse<br>gadmin bayrağı otomatik olarak<br>kaldırılacaktır.<br>"
+
+#~ msgid "Display a user's flags"
+#~ msgstr "Bir kullanıcının bayrağını görüntüle"
+
+#~ msgid "Display a user's flags<br><br><i>Example:</i> site flags<br><br>This will show your own flags.<br><br><i>Example:</i> site flags Archimede<br><br>This will show flags of user Archimede.<br>"
+#~ msgstr "Bir kullanıcının bayrağını görüntüle<br><br><i>Örnek:</i> site flags<br><br>Bu sizin kendi bayraklarınızı gösterecektir.<br><br><i>Örnek:</i> site flags Archimede<br><br>Bu Archimede.kullanıcısının bayraklarını gösterecektir.<br>"
+
+#~ msgid "Kick a user off the site"
+#~ msgstr "Bir kullanıcıyı siteden çıkar"
+
+#~ msgid "Kick a user off the site<br><br><i>Example:</i> site kick Archimede<br><br>This will kill all connections for the user 'Archimede'<br>"
+#~ msgstr "Bir kullanıcıyı siteden çıkar<br><br><i>Örnek:</i> site kick Archimede<br><br>Bu Archimede''in tüm bağlantılarını koparacaktır<br>"
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers."
+#~ msgstr "Silinmiş kullanıcıları kaldır, READD sitesi temizlenmiş kullanıcılarda çalışmayacaktır."
+
+#~ msgid "Remove deleted users, site READD will NOT work for purged uers.<br><br><i>Example:</i> site purge<br>This will REMOVE ALL users who have the DELETED flag.<br><br><i>Example:</i> site purge frank<br>This will remove just frank and leave the rest of deleted users on site<br><br>If you are a gadmin, you can only purge users from your group (that is,<br>if you are given access to this command in the config file).<br>"
+#~ msgstr "Silinmiş kullanıcıları kaldır, READD sitesi temizlenmiş kullanıcılarda çalışmayacaktır.<br><br><i>Örnek:</i> site purge<br>Bu bayrağı silinmiş tüm kullanıcıları kaldıracaktır.<br><br><i>Örnek:</i> site purge frank<br>Bu sadece frank'i kaldıracak ve silinmiş tüm kullanıcıları sitede bırakacaktır<br><br>Eğer bir gadminseniz, kullanıcıları sadece gruptan kaldırabilirsiniz (ki bu da<br>eğer size config dosyasında bu komut için izin verilmişse geçerlidir).<br>"
+
+#~ msgid "Readd user"
+#~ msgstr "Kullanıcıyı yeniden ekle"
+
+#~ msgid "Readd user<br><br><i>Example:</i> site readd<br><br>This will show a list of users that can be readded.<br>(You can also achieve this with \"site users deleted\")<br><br><i>Example:</i> site readd Archimede<br><br>This will remove the DELETED flag for user 'Archimede'.<br><br><b>NOTE:</b> When readding a user from a group the group must have available slots<br>left, even when you are a siteop.<br>"
+#~ msgstr "Kullanıcıyı yeniden ekle<br><br><i>Örnek:</i> site readd<br><br>Bu yeniden eklenebilen kullanıcıların listesini gösterecektir.<br>(Bunu şu yolla da başarabilirsiniz \"site users deleted\")<br><br><i>Örnek:</i> site readd Archimede<br><br>Bu bayrağı SİLİNMİŞ olan 'Archimede' kullanıcısını kaldıracaktır.<br><br><b>DİKKAT:</b>Gruptan bir kullanıcıyı yeniden eklediğinizde bunun için yuvalar uygun olmalıdır<br>,bu durum site operatörü olsanız bile değişmez.<br>"
+
+#~ msgid "Display a user's upload/download statistics"
+#~ msgstr "Bir kullanıcının yükleme/indirme istatiğini görüntüle"
+
+#~ msgid "Display a user's upload/download statistics<br><br>Definable in '/ftp-data/text/user.stats'<br><br>If you have multiple sections then this will display stats from<br>all sections. (But you have to copy this file to SECTIONuser.stats.<br>exmp: if you have a section called GAMES then glftpd will look<br>for the files user.stats and GAMESuser.stats in the /ftp-data/text dir.<br>"
+#~ msgstr "Bir kullanıcının yükleme/indirme istatiğini görüntüle<br><br>Tanımlanabilir'/ftp-veri/metin/kullanıcı istatistiği'<br><br>Eğer çoklu bölümleriniz varsa bunlar<br>bütün bölümlerde görüntülenecektir.(Fakat bu dosyayı BÖLÜMkullanıcı.istatistkilerine kopyalamalısınız.<br>örn: eğer OYUNLAR adlı bir bölümünüz varsa bu durumda glftpd <br>kullanıcı istatistiğindeki ve GAMESuser.stats in the /ftp-veri/metin dizinindeki OYUNkullanıcı.istatistiklerindeki dosyaları arayacaktır<br>"
+
+#~ msgid "Lists users / Shows detailed info about a user"
+#~ msgstr "Kullanıcıları listeler / Kullanıcı hakkındaki ayrıntılı bilgiyi gösterir"
+
+#~ msgid "Lists users / Shows detailed info about a user<br><br><i>Example:</i> site user<br><br>This will display a list of all users currently on site.<br><br><i>Example:</i> site user Archimede<br><br>This will show detailed information about user 'Archimede'.<br>"
+#~ msgstr "Kullanıcıları listeler / Kullanıcı hakkındaki ayrıntılı bilgiyi gösterir<br><br><i>Örnek:</i> site kullanıcısı<br><br>Bu şu anda sitedeki tüm kullanıcıları görüntüler.<br><br><i>Örnek:</i> site kullanıcısı Archimede<br><br>Bu 'Archimede' kullanıcısı ile ilgili detaylı bilgiyi gösterecektir.<br>"
+
+#~ msgid "Shows available groups"
+#~ msgstr "Uygun grupları gösterir"
+
+#~ msgid "Shows detailed info on a group"
+#~ msgstr "Bir grubun detaylı bilgisini gösterir"
+
+#~ msgid "Shows detailed info on a group<br><br><i>Example:</i> site ginfo ftp<br><br>This will show detailed info on the group 'ftp'.<br>If a user is deleted, their tagline will be replaced by \"***DELETED***\".<br>"
+#~ msgstr "Bir grubun detaylı bilgisini gösterir<br><br><i>Örnek:</i> site ginfo ftp<br><br>Bu 'ftp' grubunun detaylı bilgisini gösterecektir.<br>Eğer bir kullanıcı silinmişse onun durumu \"***SİLİNMİŞ***\" olarak değişecektir.<br>"
+
+#~ msgid "Add a new group"
+#~ msgstr "Yeni bir grup ekle"
+
+#~ msgid "Add a new group<br><br><i>Example:</i> site grpadd group new_group<br><br>This would add the group 'group' with the description 'new_group'.<br>"
+#~ msgstr "Yeni bir grup ekle<br><br><i>Örnek:</i> site grpadd group new_group<br><br>Bu 'group' adlı grubu 'yeni_grup' tanımıyla ekleyecektir.<br>"
+
+#~ msgid "Delete a group"
+#~ msgstr "Bir grup sil"
+
+#~ msgid "Delete a group<br><br><i>Example:</i> site grpdel group<br><br>This would delete the group 'group'.<br>"
+#~ msgstr "Bir grup sil<br><br><i>Örnek:</i> site grpdel group<br><br>Bu 'group' grubunu silecektir.<br>"
+
+#~ msgid "Shows your current groups or leaves/joins a group"
+#~ msgstr "Şu anki gruplarınızı veya çıktığınız/katıldığınız grupları gösterir"
+
+#~ msgid "Shows your current groups or leaves/joins a group<br>To join a group simply pass the groupname as a parameter to the<br>command. You must leave all groups before you can join a new one.<br>Only users with the siteop flag enabled can change private<br>groups (see site CHGRP).<br><br><i>Example:</i> site group<br><br>This will display the groups you are in.<br><br><i>Example:</i> site group ftp<br><br>With this you will join/leave group 'ftp'.<br>"
+#~ msgstr "Şu anki gruplarınızı veya çıktığınız/katıldığınız grupları gösterir<br>Bir gruba katılmak için basit bir şekilde grup adını <br>komutuna bir parametre olarak geçiniz..Yeni birine katılmadan önce tüm gruplardan ayrılmış olmalısınız.<br>Sadece siteop bayraklı kullanıcılar özel<br>grupları ayarlarını değiştirebilirler. (CHGRP sitesine bakın).<br><br><i>Örnek:</i> site group<br><br>Bu katılmış olduğunuz grupları gösterecektir.<br><br><i>Örnek:</i> ftp grup sitesi<br><br>Bununla 'ftp' grubuna katılabilir veya bu gruptan ayrılabilirsiniz.<br>"
+
+#~ msgid "Change description for a group"
+#~ msgstr "Grup tanımını değiştir"
+
+#~ msgid "Change description for a group<br><br><i>Example:</i> site grpnfo ftp new_description<br><br>This will change the current description for the group 'ftp' to<br>'new_description'.<br>"
+#~ msgstr "Grup tanımını değiştir<br><br><i>Örnek:</i> site grpnfo ftp new_description<br><br>Bu 'ftp' grubunun tanımımı<br>'yeni_tanım' olarak değiştirecektir.<br>"
+
+#~ msgid "Display your current status line"
+#~ msgstr "Şu anki çevrimiçi durumunuzu görüntüle"
+
+#~ msgid "Display all-time downloaders"
+#~ msgstr "Tüm indirme sürelerini görüntüle"
+
+#~ msgid "Display alltime downloaders"
+#~ msgstr "Tüm indirme sürelerini görüntüle"
+
+#~ msgid "Display all-time downloaders who belong to the group"
+#~ msgstr "Gruba ait tüm indirme sürelerini görüntüle"
+
+#~ msgid "Display all-time downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Tüm indirme süresini görüntüle.<br><grup> aynı zamanda opsiyoneldir. Onu nitelendirmek sadece <br>bu gruba ait kullanıcıları gösterir, Fakat bunu yapan kullanıcı<br>glftpd.conf haklarına özel bir giriş iznine sahip olmalıdır. Bu özellik -grpstats<br>ayarları ile kontrol edilmiştir."
+
+#~ msgid "Display all-time uploaders"
+#~ msgstr "Tüm yükleme sürelerini göster"
+
+#~ msgid "Display all-time uploaders who belong to the group"
+#~ msgstr "Gruba ait tüm yükleme sürelerini göster"
+
+#~ msgid "Display all-time uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Tüm yükleme sürelerini göster.<br><group> aynı zamanda isteğe bağlıdır. Onu belirtmek sadece<br>gruba ait kullanıcıları gösterecektir, fakat onu yapan kullanıcı<br>onu yapmak için glftpd.conf'e özel giriş hakkına sahip olmalıdır. Bu grpstats<br>ayarlarıyla kontrol edilmektedir."
+
+#~ msgid "Display daytop upload"
+#~ msgstr "Günlük en fazla yüklemeyi göster"
+
+#~ msgid "Display daytop uploaders who belong to the group"
+#~ msgstr "Bu gruba ait günlük en üst yüklemeyi göster"
+
+#~ msgid "Display daytop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Günlük en fazla yüklemeyi göster.<br><group> aynı zamanda isteğe bağlıdır. Onu belirtmek sadece<br>gruba ait kullanıcıları gösterecektir, fakat onu yapan kullanıcı<br>onu yapmak için glftpd.conf'e özel giriş hakkına sahip olmalıdır. Bu grpstats<br>ayarlarıyla kontrol edilmektedir."
+
+#~ msgid "Display daytop download"
+#~ msgstr "Günlük en fazla yüklemeyi göster"
+
+#~ msgid "Display daytop downloaders who belong to the group"
+#~ msgstr "Bu gruba ait günlük en üst indirmeyi göster"
+
+#~ msgid "Display daytop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Günlük en fazla indirmeyi göster.<br><group> aynı zamanda isteğe bağlıdır. Onu belirtmek sadece<br>gruba ait kullanıcıları gösterecektir, fakat onu yapan kullanıcı<br>onu yapmak için glftpd.conf'e özel giriş hakkına sahip olmalıdır. Bu grpstats<br>ayarlarıyla kontrol edilmektedir."
+
+#~ msgid "Display monthtop upload"
+#~ msgstr "Aylık en üst yüklemeyi göster"
+
+#~ msgid "Display monthtop uploaders who belong to the group"
+#~ msgstr "Bu gruba ait aylık en üst yüklemeyi göster"
+
+#~ msgid "Display monthtop upload.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Aylık en üst yüklemeyi göster. <br><group> aynı zamanda isteğe bağlıdır. Onu belirtmek sadece<br>gruba ait kullanıcıları gösterecektir, fakat onu yapan kullanıcı<br>onu yapmak için glftpd.conf'e özel giriş hakkına sahip olmalıdır. Bu grpstats<br>ayarlarıyla kontrol edilmektedir."
+
+#~ msgid "Display monthtop download"
+#~ msgstr "Aylık en üst indirmeyi göster"
+
+#~ msgid "Display monthtop downloaders who belong to the group"
+#~ msgstr "Bu gruba ait aylık en üst indirmeyi göster"
+
+#~ msgid "Display monthtop download.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Aylık en üst indirmeyi göster. <br><group> aynı zamanda isteğe bağlıdır. Onu belirtmek sadece<br>gruba ait kullanıcıları gösterecektir, fakat onu yapan kullanıcı<br>onu yapmak için glftpd.conf'e özel giriş hakkına sahip olmalıdır. Bu grpstats<br>ayarlarıyla kontrol edilmektedir."
+
+#~ msgid "Display weektop uploaders"
+#~ msgstr "Haftalık olarak en çok yüklenenleri görüntüle"
+
+#~ msgid "Display weektop uploaders who belong to the group"
+#~ msgstr "Gruba ait haftalık olarak en çok yüklenenleri görüntüle"
+
+#~ msgid "Display weektop uploaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Haftalık olarak en çok yüklenenleri görüntüle.<br><group> aynı zamanda isteğe bağlıdır. Onu belirtmek sadece<br>gruba ait kullanıcıları gösterecektir, fakat onu yapan kullanıcı<br>onu yapmak için glftpd.conf'e özel giriş hakkına sahip olmalıdır. Bu grpstats<br>ayarlarıyla kontrol edilmektedir."
+
+#~ msgid "Display weektop downloaders"
+#~ msgstr "Haftalık olarak en çok indirilenleri görüntüle"
+
+#~ msgid "Display weektop downloaders who belong to the group"
+#~ msgstr "Gruba ait haftalık olarak en çok indirilenleri görüntüle"
+
+#~ msgid "Display weektop downloaders.<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+#~ msgstr "Haftalık olarak en çok indirilenleri görüntüle<br><group> is also optional. Specifying it will only show users who<br>belong to that group, but the user doing it has to have special<br>access in glftpd.conf to do it. This is controlled by the -grpstats<br>setting."
+
+#~ msgid "Display server traffic"
+#~ msgstr "Sunucu trafiğini görüntüle"
+
+#~ msgid "Display server traffic<br>Display total uploads/downloads by all existing users in all sections"
+#~ msgstr "Sunucu trafiğini görüntüle<br>Tüm bölümlerde var olan kullanıcıların toplam yükleme/indirmelerini görüntüle"
+
+#~ msgid "Display alltime group upload"
+#~ msgstr "Grup yüklemelerin tüm sürelerini görüntüle"
+
+#~ msgid "Display alltime group upload<br>"
+#~ msgstr "Grup yüklemelerin tüm sürelerini görüntüle<br>"
+
+#~ msgid "Display month group upload"
+#~ msgstr "Aylık grup yüklemeleri görüntüle"
+
+#~ msgid "Display month group upload<br>"
+#~ msgstr "Aylık grup yüklemeleri görüntüle<br>"
+
+#~ msgid "Display month group download"
+#~ msgstr "Aylık grup indirmeleri görüntüle"
+
+#~ msgid "Display month group download<br>"
+#~ msgstr "Aylık grup indirmeleri görüntüle<br>"
+
+#~ msgid "Display weektop group upload"
+#~ msgstr "Haftalık grup yüklemeleri görüntüle"
+
+#~ msgid "Display weektop group upload<br>"
+#~ msgstr "Haftalık grup yüklemeleri görüntüle<br>"
+
+#~ msgid "Display weektop group download"
+#~ msgstr "Haftalık grup indirmelerini görüntüle"
+
+#~ msgid "Display weektop group download<br>"
+#~ msgstr "Haftalık grup indirmelerini görüntüle<br>"
+
+#~ msgid "Display alltime group download"
+#~ msgstr "Grupların tüm indirme sürelerini görüntüle"
+
+#~ msgid "Display alltime group download<br>"
+#~ msgstr "Grupların tüm indirme sürelerini görüntüle<br>"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming that user."
+#~ msgstr "Kullanıcının esas olarak işlem, bellek bazında kullanıcı dosyasını yükle"
+
+#~ msgid "Load user's userfile into your process' memory, essentially becoming<br>that user (although some things, like home directory or 'site who'<br>display, will not change). Need -emulate permission in config file.<br>This was created for special scripts, so they can act as some user<br>without having to know their password and logging in as that user. Most<br>siteops will find no use for this.<br><br>Note: This is not TRUE emulation, you should not use this to do serious<br>things. Some things will not work; others will work incorrectly. The<br>only way to achieve 'true' emulation is to log in as that user.<br>"
+#~ msgstr "Kullanıcının esas olarak işlem, bellek bazında kullanıcı dosyasını yükle<br>(ev dizini ya da sitedeki kişilerin görüntülenmesi değişmemesine<br>rağmen). config dosyasında öykünme izni gerekir.<br>Bu özel betikler için yaratılmıştır, böylece onlar bazı kullanıcılar gibi davranırlar<br>ki bu kullanıcıların sisteme girişteki kullandıkları şifreleri bilmeleri gerekmez. Çoğu<br>site operatörleri bunu gereksiz bulacaklar.<br><br>Dikkat:Bu GERÇEK bir öykünme değildir, Bu özelliği asla ciddi<br>şeyler yaparken kullanmamalısınız. Bazı şeyler çalışmayacaktır; diğerleri doğru çalışmayacaktır.<br>'gerçek' öykünmeyi başarmanın yolu gerçek bir kullanıcı gibi oturum açmaktan geçer.<br>"
+
+#~ msgid "Display helpscreen"
+#~ msgstr "Yardım ekranını görüntüle"
+
+#~ msgid "Display helpscreen<br>"
+#~ msgstr "Yardım ekranını görüntüle<br>"
+
+#~ msgid "Display failed logins"
+#~ msgstr "Hatalı oturum girişlerini görüntüle"
+
+#~ msgid "Display failed logins<br><br>This displays '/glftpd/ftp-data/logs/login.log'<br>See info about \"site syslog\" for syntax.<br>"
+#~ msgstr "Hatalı oturum girişlerini görüntüle<br><br>Bu '/glftpd/ftp-data/logs/login.log' dosyasını görüntüler<br>Sözdizim için bakınız \"site syslog\" for syntax.<br>"
+
+#~ msgid "Check when a user was last online"
+#~ msgstr "En son çevrimiçi kullanıcıyı görüntüle"
+
+#~ msgid "Check when a user was last online<br><br><i>Example:</i> site seen Archimede<br><br>This will display the last time Archimede logged in.<br>"
+#~ msgstr "En son çevrimiçi kullanıcıyı görüntüle<br><br><i>Örnek:</i> Archimede kullanıcısının görünümü<br><br>Archimede kullanıcısının oturum açtığı en son bilgiyi gösterir.<br>"
+
+#~ msgid "Displays the userfile in raw format"
+#~ msgstr "Kullanıcı dosyasını ham biçimde görüntüle"
+
+#~ msgid "Displays the userfile in raw format<br>"
+#~ msgstr "Kullanıcı dosyasını ham biçimde görüntüle<br>"
+
+#~ msgid "Shows detailed information about users online"
+#~ msgstr "Çevrimiçi kullanıcıların detaylı bilgilerini göster"
+
+#~ msgid "Shows detailed information about users online<br>"
+#~ msgstr "Çevrimiçi kullanıcıların detaylı bilgilerini göster<br>"
+
+#~ msgid "&Send Bookmarks To"
+#~ msgstr "&Yerimlerini Şuna Gönder"
+
+#~ msgid "<No contacts are available>"
+#~ msgstr "<Hiçbir bağlantı müsait değil>"
+
+#~ msgid "<Disabled in this version of KDE>"
+#~ msgstr "<KDE'nin bu sürümünde etkisizleştirilmiştir>"
+
+#~ msgid "<qt>You are about to send your KFTPGrabber bookmarks to <b>%1</b>. They may contain passwords or sensitive X509 certificates: sending your bookmarks may compromise their safety.<br><br>Are you sure?</qt>"
+#~ msgstr "<qt>KFTPGrabber yerimlerinizi <b>%1</b>a/e göndermek üzeresiniz. . Onlar şifre veya duyarlı X509 sertifikaları içerebilirler. Yerimlerinizi göndermek onların güvenliğini tehlikeye atabilir.<br><br>Emin misiniz?</qt>"
+
+#~ msgid "Send Bookmarks"
+#~ msgstr "Yerimlerini Gönder"
+
+#~ msgid "This server is a distributed FTP daemon"
+#~ msgstr "Bu sunucu bir dağıtılmış FTP artalan sürecidir"
+
+#~ msgid "Are you sure you want to delete this file(s)?"
+#~ msgstr "Bu dosyayı silmek istediğinizden emin misiniz?"
+
+#~ msgid "Date"
+#~ msgstr "Tarih"
+
+#~ msgid "Permissions"
+#~ msgstr "İzinler"
+
+#~ msgid "Owner"
+#~ msgstr "Sahibi"
+
+#~ msgid "Unable to open directory '%1'."
+#~ msgstr "'%1' dizinini açmak olanaksız."
+
+#~ msgid "Displaying all might take some time."
+#~ msgstr "Hepsini görüntülemek biraz zaman alabilir."
+
+#~ msgid "Are you sure?"
+#~ msgstr "Emin misiniz?"
+
+#, fuzzy
+#~ msgid "TransferSettings"
+#~ msgstr "Aktarıyor..."
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+S"
+
+#~ msgid "GeneralSettings"
+#~ msgstr "Genel Ayarlar"
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+S"
+
+#~ msgid "Add New Pattern"
+#~ msgstr "Yeni Örüntü Ekle"
+
+#~ msgid "Are you sure that you want to remove this pattern?"
+#~ msgstr "Bu örüntüyü kaldırmak istediğinizden emin misiniz?"
+
+#~ msgid "&Other"
+#~ msgstr "&Diğer"
+
+#~ msgid "Lower case filenames &upon download"
+#~ msgstr "Yüklemede &küçük harfli dosya adları"
+
+#~ msgid "Hi&ghlighting"
+#~ msgstr "Vur&gulama"
+
+#~ msgid "&Add Pattern..."
+#~ msgstr "Şablon &Ekle..."
+
+#~ msgid "E&dit..."
+#~ msgstr "&Düzenle..."
+
+#~ msgid "Re&move"
+#~ msgstr "&Sil"
+
+#~ msgid "E&nabled"
+#~ msgstr "&Etkinleştirilmiş"
+
+#~ msgid "Priorit&y List"
+#~ msgstr "Öncelik &Listesi"
+
+#~ msgid "Priority pattern:"
+#~ msgstr "Öncelikli Şablon:"
+
+#~ msgid "Patterns"
+#~ msgstr "Şablonlar"
+
+#~ msgid "&Add Pattern"
+#~ msgstr "Şablon &Ekle"
+
+#~ msgid "&Low"
+#~ msgstr "&Düşük"
+
+#~ msgid "Value:"
+#~ msgstr "Değer:"
+
+#~ msgid "&Skip"
+#~ msgstr "&Atla"
+
+#~ msgid "&High"
+#~ msgstr "&Yüksek"
+
+#~ msgid "Priority List Settings"
+#~ msgstr "Öncelik Listesi Ayarları"
+
+#~ msgid "E&nable priority list"
+#~ msgstr "Öncelik &listesini etkinleştir"
+
+#~ msgid "S&kip empty files"
+#~ msgstr "&Boş dosyaları atla"
+
+#~ msgid "Appl&y priority list to directories"
+#~ msgstr "&Dizinlere öncelik listesi uygula"
+
+#~ msgid "Do not &queue files on skip list"
+#~ msgstr "&Atlama listesindeki dosyaları kuyruğa ekleme"
+
+#~ msgid "Queue dirs before files"
+#~ msgstr "Dosyalardan önce dizinleri kuyruğa ekle"
+
+#~ msgid "A list of file patterns to be highlighted when browsing."
+#~ msgstr "Göz atıldığında vurgulanacak olan dosya örüntülerinin bir listesi."
+
+#~ msgid "Should the files on the filter list be highlighted."
+#~ msgstr "Süzgeç listesindeki dosyaların vurgulanması gerekir."
+
+#~ msgid "Should the files on the skip list be skipped."
+#~ msgstr "Atlama listesindeki dosyaların atlanması gereklidir."
+
+#~ msgid "Should empty files be skipped."
+#~ msgstr "Boş dosyaların atlanması gereklidir."
+
+#~ msgid "Does skip list applies to directories as well."
+#~ msgstr "Atlama listesi dizinlere iyice uygulanmalı."
+
+#~ msgid "Don't queue files on skip list."
+#~ msgstr "Atlama listesindeki dosyaları kuyruğa ekleme."
+
+#~ msgid "Queue directories before files."
+#~ msgstr "Dosyalardan önce kuyruk dizinleri."
+
+#~ msgid "Should all download filenames be lowercased."
+#~ msgstr "Tüm indirme dosya adları küçük harfle yazılmalıdır."
+
+#~ msgid "&Set Filter..."
+#~ msgstr "&Süzgeci Ayarla..."
+
+#~ msgid "Clear Filter"
+#~ msgstr "Süzgeci Temizle"
+
+#~ msgid "Filter"
+#~ msgstr "Süzgeç"
+
+#~ msgid "Enter filter:"
+#~ msgstr "Süzgeci gir:"
+
+#, fuzzy
+#~ msgid "KFTPBookmarkEditorTLSWidget"
+#~ msgstr "FTP Yerimi Düzenleyicisi"
+
+#~ msgid "TLS/SSL Settings"
+#~ msgstr "TLS/SSL Ayarları"
+
+#~ msgid "Transfer mode:"
+#~ msgstr "Aktarım modu:"
+
+#~ msgid "P - private (integrity and privacy)"
+#~ msgstr "P - özel (güvenli ve gizli)"
+
+#~ msgid "E - confidential (privacy without integrity)"
+#~ msgstr "E - gizli (gizli ama güvenli değil)"
+
+#~ msgid "S - safe (integrity without privacy)"
+#~ msgstr "S - güvenli (güvenli ama gizli değil)"
+
+#~ msgid "C - clear (no SSL)"
+#~ msgstr "C - temiz (SSL yok)"
+
+#, fuzzy
+#~ msgid "Data connection failed (%1)."
+#~ msgstr "Bağlantı kurulumadı (%1)."
+
+#~ msgid "Transfer:"
+#~ msgstr "Aktarım:"
+
+#~ msgid "Down: %1/s Up: %1/s"
+#~ msgstr "Aşağı: %1/s Yukarı: %1/s"
+
+#~ msgid "SFTP Reading directory listing..."
+#~ msgstr "SFTP dizin listesini okuyor..."
+
+#~ msgid "SFTP Directory changed to '%1'"
+#~ msgstr "SFTP Dizini %1 'a değişti"
+
+#~ msgid "Starting with '%1' file download"
+#~ msgstr "Yüklemeye %1 dosyası ile başlıyor"
+
+#~ msgid "Starting with '%1' file upload"
+#~ msgstr "%1 dosyası ile yüklemeye başlıyor"
+
+#~ msgid "FXP transfer failed."
+#~ msgstr "FXP aktarımı yapılamadı."
+
+#~ msgid "Protection mode setup failed, fallback to unencrypted connection."
+#~ msgstr "Koruma modu ayarı yapılamadı. 'güvenlikli olmayan' bağlantıya geri dön."
+
+#~ msgid "Unknown host '%1'."
+#~ msgstr "Bilinmeen sunucu %1"
+
+#~ msgid "Unable to establish implicit SSL connection."
+#~ msgstr "Örtülü SSL bağlantısını kurmak olanaksız."
+
+#~ msgid "Established implicit SSL connection."
+#~ msgstr "Örtülü SSL bağlantısı kuruldu."
+
+#~ msgid "Passive mode has failed two times, disabling use of PASV!"
+#~ msgstr "Edilgen kip iki kez başarısızlıkla sonuçlandı, PASV'in kullanımını etkisizleştiriyor!"
+
+#~ msgid "Directory listing complete."
+#~ msgstr "Dizin listelemesi tamamlandı."
+
+#~ msgid "Unable to connect to the server."
+#~ msgstr "Sunucuya bağlanmak olanaksız."
+
+#~ msgid "Disconnected from server."
+#~ msgstr "Sunucu bağlantısı koptu."
+
+#~ msgid "Incompatible SSL modes on source and destination server."
+#~ msgstr "Kaynakta ve varış sunucusunda uyumsuz SSL kipleri."
+
+#~ msgid "There was a problem establishing the data connection."
+#~ msgstr "Veri bağlantısını kurmakta bir sorun var."
+
+#~ msgid "Error reading file."
+#~ msgstr "Dosya okuma hatası."
+
+#~ msgid "Unable to connect with server."
+#~ msgstr "Sunucuya bağlanmak olanaksız."
+
+#~ msgid "Directory is not in cache."
+#~ msgstr "Dizin önbellekte değil."
+
+#~ msgid "Unable to open directory."
+#~ msgstr "Dizini açmak olanaksız."
+
+#~ msgid "View &Local"
+#~ msgstr "Yereli &Göster"
+
+#~ msgid "&Offline Mode"
+#~ msgstr "Çevrimdışı &Kipi"
+
+#~ msgid "This URL is not in the cache."
+#~ msgstr "Bu URL önbellekte değil."
+
+#~ msgid "Cache"
+#~ msgstr "Önbellek"
+
+#~ msgid "Cache support"
+#~ msgstr "Önbellek yardımı"
+
+#~ msgid "Enable &directory listing cache"
+#~ msgstr "&Atlama listesi etkin"
+
+#~ msgid "Alt+D"
+#~ msgstr "Alt+D"
+
+#~ msgid "Cache expiry time (in seconds):"
+#~ msgstr "Önbellek dolum zamanı (saniye bazında):"
+
+#~ msgid "Should the cache be used when browsing the sites."
+#~ msgstr "Sitelere göz atarken önbellek kullanılıyor olabilir."
+
+#~ msgid "The time after cached entries expire."
+#~ msgstr "Önbelleğe alınmış girişlerin sürelerinin dolum zamanı."
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/kftpgrabber.po b/translations/zh_CN/messages/kftpgrabber.po
new file mode 100644
index 0000000..7f13ef1
--- /dev/null
+++ b/translations/zh_CN/messages/kftpgrabber.po
@@ -0,0 +1,2928 @@
+# translation of zh_CN.po to
+# This file is put in the public domain.
+# 陆然 <hephooey@fastmail.fm>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kftpgrabber HEAD\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-04-15 07:14+0200\n"
+"PO-Revision-Date: 2006-11-18 18:33+0800\n"
+"Last-Translator: 陆然 <hephooey@fastmail.fm>\n"
+"Language-Team: zh_CN <i18n-translation@lists.linux.net.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/misc/filterwidgethandler.cpp:57
+msgid "contains"
+msgstr "包含"
+
+#: src/misc/filterwidgethandler.cpp:58
+msgid "does not contain"
+msgstr "不包含"
+
+#: src/misc/filterwidgethandler.cpp:59 src/misc/filterwidgethandler.cpp:247
+msgid "equals"
+msgstr "等于"
+
+#: src/misc/filterwidgethandler.cpp:60 src/misc/filterwidgethandler.cpp:248
+msgid "does not equal"
+msgstr "不等于"
+
+#: src/misc/filterwidgethandler.cpp:61
+msgid "matches regexp"
+msgstr "匹配正则表达式"
+
+#: src/misc/filterwidgethandler.cpp:62
+msgid "does not match regexp"
+msgstr "不匹配正则表达式"
+
+#: src/misc/filterwidgethandler.cpp:149
+msgid "is"
+msgstr "是"
+
+#: src/misc/filterwidgethandler.cpp:150
+msgid "is not"
+msgstr "不是"
+
+#: src/misc/filterwidgethandler.cpp:189 src/widgets/browser/treeview.cpp:103
+msgid "Directory"
+msgstr "目录"
+
+#: src/misc/filterwidgethandler.cpp:249
+msgid "is greater than"
+msgstr "大于"
+
+#: src/misc/filterwidgethandler.cpp:250
+msgid "is smaller than"
+msgstr "小于"
+
+#: src/misc/filterwidgethandler.cpp:289
+msgid "bytes"
+msgstr "字节"
+
+#: src/misc/filterwidgethandler.cpp:374
+msgid "Please select an action."
+msgstr "请选择一个操作。"
+
+#: src/misc/filterwidgethandler.cpp:389
+msgid "Priority:"
+msgstr "优先级:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 272
+#: rc.cpp:222 src/misc/configbase.cpp:55
+#, no-c-format
+msgid "Download"
+msgstr "下载"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 277
+#: rc.cpp:225 src/misc/configbase.cpp:56
+#, no-c-format
+msgid "Upload"
+msgstr "上载"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 282
+#: rc.cpp:228 src/misc/configbase.cpp:57
+#, no-c-format
+msgid "FXP"
+msgstr "FXP"
+
+#: src/misc/customcommands/manager.cpp:176
+msgid "Unknown tag while parsing custom site commands!"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:102
+msgid ""
+"<qt>Requested operation has failed! Response from server is:"
+"<br/><br /><b>%1</b></qt>"
+msgstr ""
+
+#: src/misc/customcommands/entry.cpp:109
+msgid "<qt>Handler named <b>%1</b> can't be found for response parsing!</qt>"
+msgstr ""
+
+#: src/misc/filter.cpp:218 src/widgets/verifier.cpp:65
+msgid "Filename"
+msgstr "文件名"
+
+#: src/misc/filter.cpp:219
+msgid "Entry Type"
+msgstr "项类型"
+
+#: src/misc/filter.cpp:220 src/widgets/failedtransfers.cpp:93
+#: src/widgets/queueview/queueview.cpp:436
+msgid "Size"
+msgstr "大小"
+
+#: src/misc/filter.cpp:223
+msgid "Change priority"
+msgstr "更改优先级"
+
+#: src/misc/filter.cpp:224
+msgid "Skip when queuing"
+msgstr ""
+
+#: src/misc/filter.cpp:225
+msgid "Colorize in list view"
+msgstr ""
+
+#: src/misc/filter.cpp:226
+msgid "Hide from list view"
+msgstr "从列表视图中隐藏"
+
+#: src/misc/filter.cpp:227
+msgid "Lowercase destination"
+msgstr "小写目标"
+
+#: src/misc/filter.cpp:311 src/widgets/filtereditor.cpp:229
+#: src/widgets/filtereditor.cpp:269
+msgid "Unnamed Rule"
+msgstr "未命名规则"
+
+#: src/misc/plugins/bookmarkimport/gftp/kftpimportgftpplugin.cpp:52
+msgid "gFTP import"
+msgstr "gFTP 导入"
+
+#: src/misc/plugins/bookmarkimport/kftp/kftpimportkftpplugin.cpp:62
+msgid "KFTPGrabber import"
+msgstr "KFTPGrabber 导入"
+
+#: src/misc/plugins/bookmarkimport/ncftp/kftpimportncftpplugin.cpp:52
+msgid "NcFtp import"
+msgstr "NcFtp 导入"
+
+#: src/misc/plugins/bookmarkimport/filezilla3/kftpimportfz3plugin.cpp:62
+msgid "FileZilla 3 import"
+msgstr "FileZilla 3 导入"
+
+#: src/kftpqueue.cpp:555
+msgid "All queued transfers have been completed."
+msgstr "队列中的全部传输已全部完成。"
+
+#: src/kftpqueue.cpp:723
+msgid "File Exists"
+msgstr "文件已存在"
+
+#: src/main.cpp:50
+msgid "KFTPGrabber - an FTP client for KDE"
+msgstr "KFTPGrabber - 一个 KDE 的 FTP 客户端"
+
+#: src/main.cpp:56
+msgid "An optional URL to connect to"
+msgstr ""
+
+#: src/main.cpp:62
+msgid "KFTPGrabber"
+msgstr "KFTPGrabber"
+
+#: src/main.cpp:64
+msgid "Lead developer"
+msgstr "开发领袖"
+
+#: src/main.cpp:65
+msgid "Developer"
+msgstr "开发者"
+
+#: src/main.cpp:67
+msgid "LibSSH code"
+msgstr "LibSSH 代码"
+
+#: src/main.cpp:68
+msgid "otpCalc code"
+msgstr "otpCalc 代码"
+
+#: src/main.cpp:69
+msgid "KopeteBalloon popup code"
+msgstr "KopeteBalloon popup 代码"
+
+#: src/main.cpp:70
+msgid "Traffic graph widget"
+msgstr "流量图控件"
+
+#: src/main.cpp:71
+msgid "Icon design"
+msgstr "图标设计"
+
+#: src/main.cpp:72 src/main.cpp:73
+msgid "Testing and debugging"
+msgstr "测试与调试"
+
+#: src/main.cpp:74
+msgid "Directory parser code"
+msgstr "目录分析器代码"
+
+#: src/main.cpp:75
+msgid "Listview column handling code"
+msgstr ""
+
+#: src/kftptransfer.cpp:345
+msgid "Transfer of the following files is complete:"
+msgstr "下列文件的传输已完成:"
+
+#: src/kftptransferfile.cpp:223
+msgid "Connection to the server has failed."
+msgstr "到服务器的连接已经失败。"
+
+#: src/kftptransferfile.cpp:227
+msgid "Login to the server has failed"
+msgstr "登录到服务器已经失败"
+
+#: src/kftptransferfile.cpp:231
+msgid "Source file cannot be found."
+msgstr "无法找到源文件。"
+
+#: src/kftptransferfile.cpp:235
+msgid "Permission was denied."
+msgstr "权限被禁止。"
+
+#: src/kftptransferfile.cpp:239
+#, fuzzy
+msgid "Unable to open local file for read or write operations."
+msgstr "无法打开文件进行写入。"
+
+#: src/kftptransferfile.cpp:243
+msgid "Transfer failed for some reason."
+msgstr "传送因故失败。"
+
+#: src/kftptransferfile.cpp:317
+msgid ""
+"Transfer of the following files <b>has been aborted</b> "
+"because there is not enough free space left on '%1':"
+msgstr "由于“%1”没有足够的空间下列文件的传输<b>被中止</b>:"
+
+#: src/engine/sftpsocket.cpp:129
+msgid "Unable to establish SSH connection (%1)"
+msgstr "无法建立 SSH 连接(%1)"
+
+#: src/engine/ftpsocket.cpp:523 src/engine/sftpsocket.cpp:134
+msgid "Logging in..."
+msgstr "正在登录..."
+
+#: src/engine/sftpsocket.cpp:135
+msgid "Connected with server, attempting to login..."
+msgstr "已经连接到服务器,正在尝试登录..."
+
+#: src/engine/ftpsocket.cpp:366 src/engine/ftpsocket.cpp:386
+#: src/engine/sftpsocket.cpp:160
+msgid "Login has failed."
+msgstr "登录失败。"
+
+#: src/engine/sftpsocket.cpp:167
+msgid "Keyboard-interactive authentication succeeded."
+msgstr "键盘交互身份验证已成功。"
+
+#: src/engine/sftpsocket.cpp:170
+msgid "Public key authentication succeeded."
+msgstr "公钥身份验证已成功。"
+
+#: src/engine/sftpsocket.cpp:179
+msgid "Unable to initialize SFTP channel."
+msgstr "无法初始化 SFTP 通道。"
+
+#: src/engine/sftpsocket.cpp:187
+msgid "Unable to initialize SFTP."
+msgstr "无法初始化 SFTP。"
+
+#: src/engine/ftpsocket.cpp:445 src/engine/sftpsocket.cpp:200
+msgid "Connected."
+msgstr "已连接。"
+
+#: src/engine/ftpsocket.cpp:486 src/engine/sftpsocket.cpp:246
+#: src/widgets/queueview/queueview.cpp:307
+msgid "Connecting..."
+msgstr "正在连接..."
+
+#: src/engine/ftpsocket.cpp:487 src/engine/sftpsocket.cpp:247
+msgid "Connecting to %1:%2..."
+msgstr "正在连接到 %1:%2..."
+
+#: src/engine/ftpsocket.cpp:575 src/engine/sftpsocket.cpp:281
+msgid "Aborted."
+msgstr "已中止。"
+
+#: src/engine/ftpsocket.cpp:1253 src/engine/sftpsocket.cpp:302
+msgid "Using cached directory listing."
+msgstr "使用缓存的目录列表。"
+
+#: src/engine/ftpsocket.cpp:1341 src/engine/ftpsocket.cpp:1342
+#: src/engine/sftpsocket.cpp:366 src/engine/sftpsocket.cpp:367
+msgid "Fetching directory listing..."
+msgstr "正在获取目录列表..."
+
+#: src/engine/ftpsocket.cpp:1525 src/engine/ftpsocket.cpp:1866
+#: src/engine/ftpsocket.cpp:2690 src/engine/sftpsocket.cpp:407
+#: src/engine/sftpsocket.cpp:503 src/engine/sftpsocket.cpp:556
+#: src/engine/sftpsocket.cpp:664
+msgid "Transfering..."
+msgstr "正在传输..."
+
+#: src/engine/ftpsocket.cpp:1526 src/engine/sftpsocket.cpp:504
+msgid "Downloading file '%1'..."
+msgstr "正在下载文件“%1”..."
+
+#: src/engine/ftpsocket.cpp:1867 src/engine/sftpsocket.cpp:665
+msgid "Uploading file '%1'..."
+msgstr "正在上传文件“%1”..."
+
+#: src/engine/ftpsocket.cpp:1951 src/engine/sftpsocket.cpp:685
+msgid "Removing..."
+msgstr "正在删除..."
+
+#: src/engine/ftpsocket.cpp:2017 src/engine/sftpsocket.cpp:712
+msgid "Renaming..."
+msgstr "正在重命名..."
+
+#: src/engine/ftpsocket.cpp:2069 src/engine/sftpsocket.cpp:732
+msgid "Changing mode..."
+msgstr "正在更改模式..."
+
+#: src/engine/ftpsocket.cpp:297
+msgid "Connection has failed."
+msgstr "连接失败。"
+
+#: src/engine/ftpsocket.cpp:314 src/engine/ftpsocket.cpp:508
+msgid ""
+"SSL negotiation successful. Connection is secured with %1 bit cipher %2."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:324
+msgid "SSL negotiation failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:330
+msgid "SSL negotiation request failed. Login aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:514
+msgid "SSL negotiation failed. Connect aborted."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:524
+msgid "Connected with server, waiting for welcome message..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:531
+msgid "Failed to connect (%1)"
+msgstr "连接失败(%1)"
+
+#: src/engine/ftpsocket.cpp:873
+msgid "Incompatible address family for PORT, but EPRT not supported, aborting!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:911
+msgid "Establishing data connection with %1:%2..."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:945 src/engine/ftpsocket.cpp:953
+msgid "Unable to establish a listening socket."
+msgstr "无法建立监听套接字。"
+
+#: src/engine/ftpsocket.cpp:993
+msgid "Waiting for data connection on port %1..."
+msgstr "正在等待端口 %1 的数据连接..."
+
+#: src/engine/ftpsocket.cpp:1006 src/engine/ftpsocket.cpp:1064
+msgid "Data connection established."
+msgstr "数据连接已建立。"
+
+#: src/engine/ftpsocket.cpp:1044
+msgid "Data channel secured with %1 bit SSL."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1046
+msgid "SSL negotiation for the data channel has failed. Aborting transfer."
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:1057 src/engine/ftpsocket.cpp:2502
+#: src/engine/ftpsocket.cpp:2512 src/engine/ftpsocket.cpp:2669
+#: src/engine/ftpsocket.cpp:2679
+msgid "Transfer completed."
+msgstr "传输已完成。"
+
+#: src/engine/ftpsocket.cpp:2113
+msgid "Making directory..."
+msgstr "正在创建目录..."
+
+#: src/engine/ftpsocket.cpp:2364
+msgid ""
+"Neither server supports SSCN/CPSV but SSL data connection requested, aborting "
+"transfer!"
+msgstr ""
+
+#: src/engine/ftpsocket.cpp:2691
+msgid "Transfering file '%1'..."
+msgstr "正在传送文件“%1”..."
+
+#: src/engine/ftpsocket.cpp:2735
+msgid "Transmitting keep-alive..."
+msgstr ""
+
+#: src/engine/socket.cpp:152
+msgid "Disconnected."
+msgstr "已断开。"
+
+#: src/engine/socket.cpp:192
+msgid "Connection timed out."
+msgstr "连接超时。"
+
+#: src/engine/connectionretry.cpp:94 src/engine/socket.cpp:295
+#: src/widgets/browser/view.cpp:185
+msgid "Idle."
+msgstr "空闲。"
+
+#: src/engine/socket.cpp:517 src/engine/socket.cpp:553
+msgid "Scan complete."
+msgstr "扫描完成。"
+
+#: src/engine/socket.cpp:567
+msgid "Starting recursive directory scan..."
+msgstr "正在开始递归目录扫描..."
+
+#: src/engine/connectionretry.cpp:66
+msgid "Waiting %1 seconds before reconnect..."
+msgstr "在重新连接之前等候 %1 秒..."
+
+#: src/engine/connectionretry.cpp:67
+msgid "Waiting..."
+msgstr "正等候..."
+
+#: src/engine/connectionretry.cpp:76
+msgid "Retrying connection (%1/%2)..."
+msgstr "正在重试连接(%1/%2)..."
+
+#: src/engine/connectionretry.cpp:78
+msgid "Retrying connection..."
+msgstr "正在重试连接..."
+
+#: src/engine/connectionretry.cpp:93
+msgid "Retry aborted."
+msgstr "重试已中止。"
+
+#: src/kftpfileexistsactions.cpp:71
+msgid "On File Exists Actions (%1)"
+msgstr "文件已存在情况下的操作(%1)"
+
+#: src/kftpfileexistsactions.cpp:77
+msgid "Size/Timestamp"
+msgstr "大小/时间戳"
+
+#: src/kftpfileexistsactions.cpp:80 src/kftpfileexistsactions.cpp:89
+msgid "Same"
+msgstr "同样"
+
+#: src/kftpfileexistsactions.cpp:83
+msgid "Older"
+msgstr "较老"
+
+#: src/kftpfileexistsactions.cpp:86
+msgid "Newer"
+msgstr "较新"
+
+#: src/kftpfileexistsactions.cpp:92
+msgid "Smaller"
+msgstr "较小"
+
+#: src/kftpfileexistsactions.cpp:95
+msgid "Bigger"
+msgstr "较大"
+
+#: src/kftpfileexistsactions.cpp:103
+msgid "Skip"
+msgstr "跳过"
+
+#: src/kftpfileexistsactions.cpp:104
+msgid "Overwrite"
+msgstr "覆盖"
+
+#: src/kftpfileexistsactions.cpp:105
+msgid "Resume"
+msgstr "续传"
+
+#: src/kftpfileexistsactions.cpp:106
+msgid "Rename"
+msgstr "重命名"
+
+#: src/kftpfileexistsactions.cpp:107
+msgid "Ask"
+msgstr "提问"
+
+#: src/kftpsession.cpp:327
+msgid "Log (%1)"
+msgstr "日志 (%1)"
+
+#: src/kftpsession.cpp:358 src/kftpsession.cpp:805
+msgid "Local Session"
+msgstr "本地会话"
+
+#: src/kftpsession.cpp:359 src/kftpsession.cpp:613 src/kftpsession.cpp:806
+#: src/mainwindow.cpp:396 src/widgets/configdialog.cpp:71
+msgid "Log"
+msgstr "日志"
+
+#: src/kftpsession.cpp:375
+msgid "Connection with %1 has been successfully established."
+msgstr "成功建立与 %1 的连接。"
+
+#: src/kftpsession.cpp:388
+#, fuzzy
+msgid "Please provide your private key decryption password."
+msgstr "请提供您的 X509 证书解密密码。"
+
+#: src/kftpsession.cpp:614
+msgid "Session"
+msgstr "会话"
+
+#: src/kftpsession.cpp:900
+#, fuzzy
+msgid "At least one session must remain open on each side."
+msgstr "每一侧至少保留一个会话"
+
+#: src/kftpsession.cpp:905
+#, fuzzy
+msgid "Please finish all transfers before closing the session."
+msgstr "请在关闭会话之前完成全部传输!"
+
+#: src/kftpsession.cpp:910
+#, fuzzy
+msgid ""
+"This session is currently connected. Are you sure you wish to disconnect?"
+msgstr "这个会话当前是连接着的,您确定要断开?"
+
+#: src/kftpsession.cpp:910
+msgid "Close Session"
+msgstr "关闭会话"
+
+#: src/mainactions.cpp:77
+msgid "Quick &Connect..."
+msgstr "快速连接(&C)..."
+
+#: src/mainactions.cpp:78
+msgid "&New Session"
+msgstr "新会话(&N)"
+
+#: src/mainactions.cpp:80
+msgid "&Left Side"
+msgstr "左侧(&L)"
+
+#: src/mainactions.cpp:81
+msgid "&Right Side"
+msgstr "右侧(&R)"
+
+#: src/mainactions.cpp:97 src/mainactions.cpp:142
+msgid "&Transfer Mode (Auto)"
+msgstr "传输模式(自动)(&T)"
+
+#: src/mainactions.cpp:98
+msgid "ASCII"
+msgstr "ASCII"
+
+#: src/mainactions.cpp:99
+msgid "Binary"
+msgstr "二进制"
+
+#: src/mainactions.cpp:100
+msgid "Auto"
+msgstr "自动"
+
+#: src/mainactions.cpp:129
+msgid "&Transfer Mode (ASCII)"
+msgstr "传输模式(ASCII)(&T)"
+
+#: src/mainactions.cpp:136
+msgid "&Transfer Mode (Binary)"
+msgstr "传输模式(二进制)(&T)"
+
+#: src/widgets/kftpserverlineedit.cpp:54
+msgid "Select..."
+msgstr "选择..."
+
+#: src/widgets/kftpserverlineedit.cpp:95
+msgid "No name"
+msgstr "没有名称"
+
+#: src/widgets/failedtransfers.cpp:59
+msgid "Transfer"
+msgstr "传输"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 101
+#: rc.cpp:103 rc.cpp:373 src/widgets/failedtransfers.cpp:92
+#, no-c-format
+msgid "Description"
+msgstr "描述"
+
+#: src/widgets/failedtransfers.cpp:97
+msgid "There are no failed transfers."
+msgstr "没有失败的传输。"
+
+#: src/widgets/failedtransfers.cpp:117
+msgid "&Restart Transfer"
+msgstr "重新开始传输(&R)"
+
+#: src/widgets/failedtransfers.cpp:118
+msgid "&Add To Queue"
+msgstr "添加到队列(&A)"
+
+#: src/widgets/failedtransfers.cpp:119
+msgid "Add All To Queue"
+msgstr "全部添加到队列"
+
+#: src/widgets/failedtransfers.cpp:120
+msgid "R&emove"
+msgstr "删除(&E)"
+
+#: src/widgets/failedtransfers.cpp:121
+msgid "Remove All"
+msgstr "全部删除"
+
+#: src/widgets/failedtransfers.cpp:180
+#, fuzzy
+msgid "Are you sure you want to remove this failed transfer?"
+msgstr "您确定要删除这个服务器?"
+
+#: src/widgets/failedtransfers.cpp:188
+msgid "Are you sure you want to remove ALL failed transfers?"
+msgstr "您确定要删除队列中失败的全部文件?"
+
+#: src/widgets/kftpfilteraddpatternlayout.cpp:85
+#: src/widgets/kftpfiltereditorlayout.cpp:101
+msgid "Form1"
+msgstr "Form1"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 41
+#: rc.cpp:30 src/widgets/kftpfilteraddpatternlayout.cpp:86
+#, no-c-format
+msgid "New Pattern"
+msgstr "新模式"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 68
+#: rc.cpp:33 src/widgets/kftpfilteraddpatternlayout.cpp:87
+#, no-c-format
+msgid "Filename pattern:"
+msgstr "文件名模式:"
+
+#. i18n: file ./src/ui/kftpfilteraddpatternlayout.ui line 76
+#: rc.cpp:36 src/widgets/kftpfilteraddpatternlayout.cpp:88
+#, no-c-format
+msgid "Color:"
+msgstr "颜色:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 138
+#: rc.cpp:459 src/widgets/quickconnect.cpp:66
+#, no-c-format
+msgid "Quick Connect"
+msgstr "快速连接"
+
+#: src/widgets/quickconnect.cpp:146
+msgid "Clear list of recently accessed sites ?"
+msgstr ""
+
+#: src/widgets/quickconnect.cpp:286
+msgid "a hostname"
+msgstr "一个主机名"
+
+#: src/widgets/quickconnect.cpp:289
+msgid "a valid port"
+msgstr "一个有效端口"
+
+#: src/widgets/quickconnect.cpp:292
+msgid "your username"
+msgstr "您的用户名"
+
+#: src/widgets/quickconnect.cpp:295
+msgid "your password"
+msgstr "您的密码"
+
+#: src/widgets/quickconnect.cpp:298
+msgid " and"
+msgstr "和"
+
+#: src/widgets/quickconnect.cpp:301
+msgid "Please enter "
+msgstr "请输入"
+
+#: src/kftpbookmarks.cpp:721 src/widgets/quickconnect.cpp:371
+msgid "Please provide your X509 certificate decryption password."
+msgstr "请提供您的 X509 证书解密密码。"
+
+#: src/widgets/kftpzeroconflistview.cpp:55
+msgid "Sites Near You"
+msgstr "您附近的站点"
+
+#: src/widgets/kftpzeroconflistview.cpp:57
+msgid "No sites published."
+msgstr "没有发布的站点。"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:59
+#: src/widgets/kftpfiltereditorlayout.cpp:105
+msgid "Pattern"
+msgstr "模式"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:60
+#: src/widgets/kftpfiltereditorlayout.cpp:106
+msgid "Color"
+msgstr "颜色"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:102
+msgid "Add pattern"
+msgstr "添加模式"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:107
+msgid "Enabled"
+msgstr "启用"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:108
+msgid "Highlighting"
+msgstr "高亮"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:109
+#: src/widgets/kftpfiltereditorlayout.cpp:111
+msgid "<b>Not yet implemented.</b>"
+msgstr "<b>尚未实现。</b>"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:110
+msgid "Skip List"
+msgstr "跳过列表"
+
+#: src/widgets/kftpfiltereditorlayout.cpp:112
+msgid "ASCII xtensions"
+msgstr "ASCII 扩展名"
+
+#: src/widgets/configdialog.cpp:69
+msgid "General"
+msgstr "常规"
+
+#: src/widgets/configdialog.cpp:70
+msgid "Transfers"
+msgstr "传输"
+
+#: src/widgets/configdialog.cpp:72
+msgid "Display"
+msgstr "显示"
+
+#: src/widgets/configdialog.cpp:83 src/widgets/filtereditor.cpp:499
+msgid "Actions"
+msgstr "操作"
+
+#: src/widgets/configdialog.cpp:90 src/widgets/configfilter.cpp:71
+#: src/widgets/filtereditor.cpp:129
+msgid "Filters"
+msgstr "过滤器"
+
+#: src/widgets/verifier.cpp:58
+msgid "Checksum verifier"
+msgstr ""
+
+#: src/widgets/verifier.cpp:66
+msgid "Checksum"
+msgstr "校验和"
+
+#: src/widgets/verifier.cpp:137
+msgid "Verification complete!"
+msgstr "验证完成!"
+
+#: src/widgets/verifier.cpp:143
+msgid "Unable to open checksum file or file has an incorrect format!"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:67
+msgid "Filter &enabled"
+msgstr "过滤器已启用(&E)"
+
+#: src/widgets/filtereditor.cpp:136
+msgid "No filters."
+msgstr "无过滤器。"
+
+#: src/widgets/filtereditor.cpp:154
+msgid "Up"
+msgstr "上移"
+
+#: src/widgets/filtereditor.cpp:155
+msgid "Down"
+msgstr "下移"
+
+#: src/widgets/filtereditor.cpp:173
+msgid "Rename..."
+msgstr "重命名..."
+
+#: src/widgets/filtereditor.cpp:175
+msgid "New"
+msgstr "新建"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename Rule"
+msgstr "重命名规则"
+
+#: src/widgets/filtereditor.cpp:266
+msgid "Rename rule '%1' to:"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:333
+msgid "Conditions"
+msgstr "条件"
+
+#: src/widgets/filtereditor.cpp:337
+msgid "Match a&ll of the following"
+msgstr ""
+
+#: src/widgets/filtereditor.cpp:338
+msgid "Match an&y of the following"
+msgstr ""
+
+#: src/widgets/searchdialog.cpp:54
+msgid "Search & Replace"
+msgstr "搜索和替换"
+
+#: src/widgets/trafficgraph.cpp:429
+msgid "Bandwidth usage"
+msgstr "带宽占用"
+
+#: src/widgets/widgetlister.cpp:63
+msgid ""
+"_: more widgets\n"
+"More"
+msgstr "更多"
+
+#: src/widgets/widgetlister.cpp:66
+msgid ""
+"_: fewer widgets\n"
+"Fewer"
+msgstr "更少"
+
+#: src/widgets/widgetlister.cpp:72
+msgid ""
+"_: clear widgets\n"
+"Clear"
+msgstr "清除"
+
+#: src/widgets/queueview/queueview.cpp:255
+msgid "stalled"
+msgstr "停滞"
+
+#: src/widgets/queueview/queueview.cpp:258
+msgid "running"
+msgstr "运行中"
+
+#: src/widgets/queueview/queueview.cpp:303
+msgid "Waiting for connection..."
+msgstr "正在等待连接..."
+
+#: src/widgets/browser/view.cpp:136 src/widgets/queueview/queueview.cpp:417
+msgid "Filter: "
+msgstr "过滤器:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 90
+#: rc.cpp:100 src/widgets/queueview/queueview.cpp:435
+#: src/widgets/queueview/threadview.cpp:151
+#, no-c-format
+msgid "Name"
+msgstr "名称"
+
+#: src/widgets/queueview/queueview.cpp:437
+msgid "Source"
+msgstr "源"
+
+#: src/widgets/queueview/queueview.cpp:438
+msgid "Destination"
+msgstr "目标"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 36
+#: rc.cpp:619 src/widgets/queueview/queueview.cpp:439
+#, no-c-format
+msgid "Progress"
+msgstr "进度"
+
+#: src/widgets/queueview/queueview.cpp:440
+#: src/widgets/queueview/threadview.cpp:153
+msgid "Speed"
+msgstr "速度"
+
+#: src/widgets/queueview/queueview.cpp:441
+msgid "ETA"
+msgstr "预计剩余时间"
+
+#: src/widgets/queueview/queueview.cpp:444
+msgid "You do not have any files in the queue."
+msgstr "队列中没有文件。"
+
+#: src/widgets/queueview/queueview.cpp:508
+msgid "Limit download transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:509
+#, fuzzy
+msgid "Down: "
+msgstr "下移"
+
+#: src/widgets/queueview/queueview.cpp:517
+msgid "Limit upload transfer speed"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:518
+#, fuzzy
+msgid "Up: "
+msgstr "上移"
+
+#: src/widgets/queueview/queueview.cpp:527
+msgid "Per-session transfer thread count"
+msgstr ""
+
+#: src/widgets/queueview/queueview.cpp:528
+#, fuzzy
+msgid "Threads: "
+msgstr "线程"
+
+#: src/widgets/queueview/queueview.cpp:557
+msgid "&Start Transfer"
+msgstr "开始传输(&S)"
+
+#: src/widgets/queueview/queueview.cpp:558
+msgid "&Abort Transfer"
+msgstr "中止传输(&A)"
+
+#: src/widgets/queueview/queueview.cpp:560
+msgid "Remove &All"
+msgstr "全部删除(&A)"
+
+#: src/widgets/queueview/queueview.cpp:561
+msgid "Move &Up"
+msgstr "向上移动(&U)"
+
+#: src/widgets/queueview/queueview.cpp:562
+msgid "Move &Down"
+msgstr "向下移动(&D)"
+
+#: src/widgets/queueview/queueview.cpp:563
+msgid "Move To &Top"
+msgstr "移至顶端(&T)"
+
+#: src/widgets/queueview/queueview.cpp:564
+msgid "Move To &Bottom"
+msgstr "移至底端(&B)"
+
+#: src/widgets/queueview/queueview.cpp:565
+msgid "&Change Transfer Info"
+msgstr "更改传输信息(&C)"
+
+#: src/widgets/queueview/queueview.cpp:568
+msgid "&Load Queue From File"
+msgstr "从文件中加载队列(&L)"
+
+#: src/widgets/queueview/queueview.cpp:569
+msgid "&Save Queue to File"
+msgstr "将队列保存到文件(&S)"
+
+#: src/widgets/queueview/queueview.cpp:570
+msgid "S&tart"
+msgstr "开始(&T)"
+
+#: src/widgets/queueview/queueview.cpp:571
+msgid "&Pause"
+msgstr "暂停(&P)"
+
+#: src/widgets/queueview/queueview.cpp:573
+msgid "&Add Transfer..."
+msgstr "添加传输(&A)..."
+
+#: src/widgets/queueview/queueview.cpp:574
+msgid "&Search && Replace..."
+msgstr "搜索并替换(&S)..."
+
+#: src/widgets/browser/actions.cpp:106 src/widgets/queueview/queueview.cpp:575
+msgid "Show &Filter"
+msgstr "显示过滤器(&F)"
+
+#: src/widgets/queueview/queueview.cpp:704
+msgid "Site"
+msgstr "站点"
+
+#: src/widgets/queueview/queueview.cpp:734
+msgid "Are you sure you want to remove queued file(s)?"
+msgstr "您确定要删除队列中的文件?"
+
+#: src/widgets/queueview/queueview.cpp:750
+msgid "Are you sure you want to remove ALL queued files?"
+msgstr "您确定要删除队列中的全部文件?"
+
+#: src/widgets/queueview/queueview.cpp:834
+#, fuzzy
+msgid ""
+"Loading a new queue will overwrite the existing one; are you sure you want to "
+"continue?"
+msgstr "加载一个新的队列将会覆盖当前队列!您确定要继续吗?"
+
+#: src/widgets/queueview/queueview.cpp:834
+msgid "Load Queue"
+msgstr "加载队列"
+
+#: src/widgets/queueview/threadview.cpp:90
+msgid "Site session [%1]"
+msgstr "站点会话[%1]"
+
+#: src/widgets/queueview/threadview.cpp:93
+#, c-format
+msgid "Thread %1"
+msgstr "线程%1"
+
+#: src/mainwindow.cpp:325 src/widgets/queueview/threadview.cpp:95
+msgid "idle"
+msgstr "空闲"
+
+#: src/widgets/queueview/threadview.cpp:95
+msgid "disconnected"
+msgstr "已断开"
+
+#: src/widgets/queueview/threadview.cpp:111
+msgid "connecting"
+msgstr "正连接"
+
+#: src/widgets/queueview/threadview.cpp:113
+msgid "transferring"
+msgstr "正传输"
+
+#: src/widgets/queueview/threadview.cpp:119
+msgid "FXP - [%1]"
+msgstr "FXP - [%1]"
+
+#: src/widgets/queueview/threadview.cpp:152
+msgid "Status"
+msgstr "状态"
+
+#: src/widgets/queueview/threadview.cpp:156
+msgid "There are no threads currently running."
+msgstr "目前没有正在运行的线程。"
+
+#: src/widgets/bookmarks/listview.cpp:95
+msgid "No bookmarks."
+msgstr "无书签。"
+
+#: src/widgets/bookmarks/listview.cpp:112
+msgid "&New..."
+msgstr "新建(&N)..."
+
+#: src/widgets/bookmarks/listview.cpp:113 src/widgets/browser/actions.cpp:108
+msgid "&Rename"
+msgstr "重命名(&R)"
+
+#: src/widgets/bookmarks/listview.cpp:115
+msgid "&Create Subcategory..."
+msgstr "创建子类别(&C)..."
+
+#: src/widgets/bookmarks/listview.cpp:116
+msgid "&Duplicate"
+msgstr "创建复本(&D)"
+
+#: src/kftpbookmarks.cpp:878 src/widgets/bookmarks/listview.cpp:157
+msgid "Please provide your username and password for connecting to this site."
+msgstr ""
+
+#: src/kftpbookmarks.cpp:879 src/widgets/bookmarks/listview.cpp:158
+msgid "Site:"
+msgstr "站点:"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Category Name"
+msgstr "类别名"
+
+#: src/widgets/bookmarks/listview.cpp:367
+msgid "Rename category:"
+msgstr "重命名类别:"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New Category Name"
+msgstr "新类别名"
+
+#: src/widgets/bookmarks/listview.cpp:383
+msgid "New category:"
+msgstr "新类别:"
+
+#: src/widgets/bookmarks/listview.cpp:403
+msgid "New server"
+msgstr "新服务器"
+
+#: src/widgets/bookmarks/listview.cpp:409
+#: src/widgets/bookmarks/listview.cpp:411
+#: src/widgets/bookmarks/listview.cpp:414
+msgid "New Server"
+msgstr "新服务器"
+
+#: src/widgets/bookmarks/listview.cpp:473
+msgid "Are you sure you want to remove this category?"
+msgstr "您确定要删除这个类别?"
+
+#: src/widgets/bookmarks/listview.cpp:480
+msgid "Are you sure you want to remove this server?"
+msgstr "您确定要删除这个服务器?"
+
+#: src/widgets/bookmarks/importwizard.cpp:99
+msgid "Unable to load the selected import plugin."
+msgstr "无法加载所选的导入插件。"
+
+#: src/widgets/bookmarks/importwizard.cpp:108
+msgid "The selected file does not exist or is not readable."
+msgstr "所选文件不存在或者不可读。"
+
+#: src/widgets/bookmarks/importwizard.cpp:130
+msgid "Bookmark importing is complete."
+msgstr "书签导入完成。"
+
+#: src/widgets/bookmarks/sidebar.cpp:80
+msgid "&Edit..."
+msgstr "编辑(&E)..."
+
+#: src/widgets/bookmarks/editortls.cpp:65
+msgid "SSL/TLS Settings"
+msgstr "SSL/TLS 设置"
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Import..."
+msgstr "导入..."
+
+#: src/widgets/bookmarks/editor.cpp:82
+msgid "Export..."
+msgstr "导出..."
+
+#: src/widgets/bookmarks/editor.cpp:118
+msgid "FTP Bookmark Editor"
+msgstr "FTP 书签编辑器"
+
+#: src/widgets/bookmarks/editor.cpp:197
+#, fuzzy
+msgid ""
+"<qt>You are about to export your KFTPGrabber bookmarks. They may contain "
+"passwords or sensitive X509 certificates; exporting your bookmarks may "
+"compromise their safety."
+"<br>"
+"<br>Are you sure?</qt>"
+msgstr ""
+"<qt>您的 KFTPGrabber 书签将被发送给 <b>%1</b> !其中可能包含密码或者敏感的 X509 证书!发送您的书签可能会影响他们的安全。"
+"<br>"
+"<br>您确定吗?</qt>"
+
+#: src/widgets/bookmarks/editor.cpp:197 src/widgets/bookmarks/editor.cpp:201
+msgid "Export Bookmarks"
+msgstr "导出书签"
+
+#: src/widgets/browser/dirlister.cpp:140
+#, c-format
+msgid "Could not enter folder %1."
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:104
+msgid "&Abort"
+msgstr "中止(&A)"
+
+#: src/widgets/browser/actions.cpp:105
+msgid "&Show Tree View"
+msgstr "显示树状视图(&S)"
+
+#: src/widgets/browser/actions.cpp:110
+msgid "&Properties"
+msgstr "属性(&P)"
+
+#: src/widgets/browser/actions.cpp:111 src/widgets/browser/actions.cpp:326
+msgid "&Shred"
+msgstr "粉碎(&S)"
+
+#: src/widgets/browser/actions.cpp:116
+msgid "&Filter Options"
+msgstr "过滤选项(&F)"
+
+#: src/widgets/browser/actions.cpp:117
+msgid "Always &skip this file when queuing"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:118
+msgid "Make this file &top priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:119
+msgid "Make this file &lowest priority"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:125
+msgid "&Transfer"
+msgstr "传输(&T)"
+
+#: src/widgets/browser/actions.cpp:126
+msgid "&Queue Transfer"
+msgstr "加入传输队列(&Q)"
+
+#: src/widgets/browser/actions.cpp:127
+msgid "&Create Directory..."
+msgstr "创建目录(&C)..."
+
+#: src/widgets/browser/actions.cpp:128
+msgid "&Open file"
+msgstr "打开文件(&O)"
+
+#: src/widgets/browser/actions.cpp:129
+msgid "&Verify..."
+msgstr "校验(&V)..."
+
+#: src/widgets/browser/actions.cpp:133
+msgid "&More Actions"
+msgstr "更多操作(&M)"
+
+#: src/widgets/browser/actions.cpp:134
+msgid "&Manual Command Entry..."
+msgstr "手动输入命令(&M)..."
+
+#: src/widgets/browser/actions.cpp:135
+msgid "&Export Directory Listing..."
+msgstr "导出目录列表(&E)..."
+
+#: src/widgets/browser/actions.cpp:136
+msgid "Show &Hidden Files && Directories"
+msgstr "显示隐藏的文件和目录(&H)"
+
+#: src/widgets/browser/actions.cpp:137
+msgid "Open current directory in &Konqueror..."
+msgstr "在 Konqueror 中打开当前目录(&K)..."
+
+#: src/widgets/browser/actions.cpp:139
+msgid "Compare &selected items"
+msgstr "比较选中项(&S)"
+
+#: src/widgets/browser/actions.cpp:140
+msgid "Compare &directories"
+msgstr "比较目录(&D)"
+
+#: src/widgets/browser/actions.cpp:144
+msgid "Send &Raw Command"
+msgstr "发送原始命令(&R)"
+
+#: src/widgets/browser/actions.cpp:161
+msgid "&Change Site"
+msgstr "改变站点(&C)"
+
+#: src/widgets/browser/actions.cpp:162
+msgid "&Quick Connect..."
+msgstr "快速连接(&Q)..."
+
+#: src/widgets/browser/actions.cpp:163
+msgid "&Connect To"
+msgstr "连接到(&C)"
+
+#: src/widgets/browser/actions.cpp:164
+msgid "&Disconnect"
+msgstr "断开连接(&D)"
+
+#: src/widgets/browser/actions.cpp:179
+msgid "Change Remote &Encoding"
+msgstr "更改远程编码(&E)"
+
+#: src/kftpbookmarks.cpp:908 src/widgets/browser/actions.cpp:298
+#: src/widgets/browser/actions.cpp:316
+msgid "Do you want to drop current connection?"
+msgstr "是否断开当前连接?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Are you sure you want to SHRED this file?"
+msgstr "您确定想要粉碎这个文件吗?"
+
+#: src/widgets/browser/actions.cpp:326
+msgid "Shred File"
+msgstr "粉碎文件"
+
+#: src/widgets/browser/actions.cpp:371
+#, c-format
+msgid ""
+"_n: Do you really want to delete this item?\n"
+"Do you really want to delete these %n items?"
+msgstr ""
+
+#: src/widgets/browser/actions.cpp:373
+msgid "Delete Files"
+msgstr "删除文件"
+
+#: src/widgets/browser/actions.cpp:452
+msgid "Skip '%1'"
+msgstr "跳过“%1”"
+
+#: src/widgets/browser/actions.cpp:456
+msgid "Priority '%1'"
+msgstr "优先级“%1”"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Create Directory"
+msgstr "创建目录"
+
+#: src/widgets/browser/actions.cpp:543
+msgid "Directory name:"
+msgstr "目录名:"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Send Raw Command"
+msgstr "发送原始命令"
+
+#: src/widgets/browser/actions.cpp:591
+msgid "Command:"
+msgstr "命令:"
+
+#: src/widgets/browser/actions.cpp:648
+msgid "Export Directory Listing"
+msgstr "导出目录列表"
+
+#: src/widgets/browser/actions.cpp:751
+msgid ""
+"Identical files on both sides have been hidden. Only <b>different files</b> "
+"are now visible."
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 42
+#: rc.cpp:330 rc.cpp:449 rc.cpp:547 src/widgets/browser/propsplugin.cpp:58
+#, no-c-format
+msgid "&General"
+msgstr "常规(&G)"
+
+#: src/widgets/browser/propsplugin.cpp:77
+#: src/widgets/browser/propsplugin.cpp:86
+msgid "Remote folder"
+msgstr "远程文件夹"
+
+#: src/widgets/browser/propsplugin.cpp:98
+msgid "Unknown"
+msgstr "未知"
+
+#: src/widgets/browser/propsplugin.cpp:149
+msgid "Type:"
+msgstr "类型:"
+
+#: src/widgets/browser/propsplugin.cpp:156
+msgid "Location:"
+msgstr "位置:"
+
+#: src/widgets/browser/propsplugin.cpp:163
+msgid "Size:"
+msgstr "大小:"
+
+#: src/widgets/browser/propsplugin.cpp:178
+msgid "Created:"
+msgstr "创建于:"
+
+#: src/widgets/browser/propsplugin.cpp:206
+msgid "&Permissions"
+msgstr "权限(&P)"
+
+#: src/widgets/browser/propsplugin.cpp:240
+msgid "Access Permissions"
+msgstr "访问权限"
+
+#: src/widgets/browser/propsplugin.cpp:247
+msgid "Class"
+msgstr "类"
+
+#: src/widgets/browser/propsplugin.cpp:251
+msgid ""
+"Show\n"
+"Entries"
+msgstr ""
+"显示\n"
+"项目"
+
+#: src/widgets/browser/propsplugin.cpp:253
+msgid "Read"
+msgstr "读"
+
+#: src/widgets/browser/propsplugin.cpp:257
+msgid ""
+"Write\n"
+"Entries"
+msgstr ""
+"写入\n"
+"项目"
+
+#: src/widgets/browser/propsplugin.cpp:259
+msgid "Write"
+msgstr "写"
+
+#: src/widgets/browser/propsplugin.cpp:263
+msgid ""
+"_: Enter folder\n"
+"Enter"
+msgstr "进入"
+
+#: src/widgets/browser/propsplugin.cpp:265
+msgid "Exec"
+msgstr "执行"
+
+#: src/widgets/browser/propsplugin.cpp:272
+msgid "Special"
+msgstr "特殊"
+
+#: src/widgets/browser/propsplugin.cpp:275
+msgid "User"
+msgstr "用户"
+
+#: src/widgets/browser/propsplugin.cpp:278
+msgid "Group"
+msgstr "组"
+
+#: src/widgets/browser/propsplugin.cpp:281
+msgid "Others"
+msgstr "其它"
+
+#: src/widgets/browser/propsplugin.cpp:284
+msgid "Set UID"
+msgstr "设置 UID"
+
+#: src/widgets/browser/propsplugin.cpp:287
+msgid "Set GID"
+msgstr "设置 GID"
+
+#: src/widgets/browser/propsplugin.cpp:290
+msgid "Sticky"
+msgstr "粘性"
+
+#: src/widgets/browser/propsplugin.cpp:311
+msgid "Apply changes to all subfolders and their contents"
+msgstr ""
+
+#: src/widgets/browser/treeview.cpp:142
+msgid "Root directory"
+msgstr "根目录"
+
+#: src/widgets/browser/view.cpp:143
+msgid "Path: "
+msgstr "路径:"
+
+#: src/widgets/browser/view.cpp:392
+msgid ""
+"This is a SSH encrypted connection. No certificate info is currently available."
+msgstr "这是一个 SSH 加密的连接。目前没有可用的证书信息。"
+
+#: src/widgets/browser/filterwidget.cpp:88
+msgid "Filter Options"
+msgstr "过滤选项"
+
+#: src/widgets/browser/filterwidget.cpp:90
+msgid "Filter Directories"
+msgstr "过滤目录"
+
+#: src/widgets/browser/filterwidget.cpp:93
+msgid "Filter Symlinks"
+msgstr "过滤符号链接"
+
+#: src/widgets/browser/filterwidget.cpp:96
+msgid "Case Sensitive"
+msgstr "区分大小写"
+
+#: src/widgets/logview.cpp:64
+msgid "<b>KFTPGrabber</b> logger initialized.<br>"
+msgstr "<b>KFTPGrabber </b>日志记录初始化。<br>"
+
+#: src/widgets/logview.cpp:94
+msgid "Unable to open file for writing."
+msgstr "无法打开文件进行写入。"
+
+#: src/mainwindow.cpp:153
+msgid ""
+"<qt>Unable to find %1 XML GUI descriptor file. Please check that you have "
+"installed the application correctly! If you have any questions please ask on "
+"%2."
+"<br>"
+"<br><b>Warning:</b> Current GUI will be incomplete!</qt>"
+msgstr ""
+
+#: src/mainwindow.cpp:231
+msgid ""
+"<p>Closing the main window will keep KFTPGrabber running in the system tray. "
+"Use <b>Quit</b> from the <b>KFTPGrabber</b> menu to quit the application.</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+msgstr ""
+"<p>关闭主窗口后 KFTPGrabber 将在系统托盘内继续运行。请使用 <b>KFTPGrabber</b> 菜单中的<b>退出</b>"
+"选项退出程序。</p>"
+"<p>"
+"<center><img source=\"systray_shot\"></center></p>"
+
+#: src/mainwindow.cpp:234
+msgid "Docking in System Tray"
+msgstr "停靠至系统托盘"
+
+#: src/mainwindow.cpp:242
+#, c-format
+msgid ""
+"_n: There is currently a transfer running.\n"
+"There are currently %n transfers running."
+msgstr "当前有 %n 个传输在进行。"
+
+#: src/mainwindow.cpp:243
+msgid ""
+"\n"
+"Are you sure you want to quit?"
+msgstr ""
+"\n"
+"您确定想要退出吗?"
+
+#: src/mainwindow.cpp:300
+msgid "FTP Sites Near Me"
+msgstr "我附近的 FTP 站点"
+
+#: src/mainwindow.cpp:304
+msgid "Sites In KWallet"
+msgstr "KWallet 中的站点"
+
+#: src/mainwindow.cpp:306
+msgid "Edit Bookmarks..."
+msgstr "编辑书签..."
+
+#: src/mainwindow.cpp:328 src/mainwindow.cpp:403
+msgid "Download: %1/s"
+msgstr "下载:%1/s"
+
+#: src/mainwindow.cpp:329 src/mainwindow.cpp:404
+msgid "Upload: %1/s"
+msgstr "上载:%1/s"
+
+#: src/mainwindow.cpp:343
+msgid "Queue"
+msgstr "队列"
+
+#. i18n: file ./src/ui/config_transfers.ui line 614
+#: rc.cpp:306 src/mainwindow.cpp:344
+#, no-c-format
+msgid "Failed Transfers"
+msgstr "失败的传送"
+
+#: src/mainwindow.cpp:358
+msgid "Sites Near Me"
+msgstr "我附近的站点"
+
+#. i18n: file ./src/ui/config_transfers.ui line 532
+#: rc.cpp:294 src/mainwindow.cpp:395
+#, no-c-format
+msgid "Threads"
+msgstr "线程"
+
+#: src/mainwindow.cpp:397
+msgid "Traffic"
+msgstr "流量"
+
+#: src/kftpbookmarks.cpp:97
+msgid "Copy of"
+msgstr "副本"
+
+#: src/kftpbookmarks.cpp:307
+#, fuzzy
+msgid "This bookmark file is encrypted. Please enter key for decryption."
+msgstr "这个书签文件是加密的。请输入密钥解密!"
+
+#: src/kftpbookmarks.cpp:326
+#, fuzzy
+msgid ""
+"<qt>Bookmark file decryption has failed with provided key. Do you want to <b>"
+"overwrite</b> bookmarks with an empty file ?"
+"<br>"
+"<br><font color=\"red\"><b>Warning:</b> If you overwrite, all current bookmarks "
+"will be lost.</font></qt>"
+msgstr ""
+"<qt>用所给密钥解密书签文件失败!您是否想用一个空的文件<b>覆盖</b>书签文件?"
+"<br>"
+"<br><font color=\"red\"><b>警告:</b>如果您选择覆盖,所有当前书签将会丢失</font></qt>"
+
+#: src/kftpbookmarks.cpp:327
+msgid "Decryption Failed"
+msgstr "解密失败"
+
+#: src/kftpbookmarks.cpp:328
+msgid "&Overwrite Bookmarks"
+msgstr "覆盖书签(&O)"
+
+#: src/kftpbookmarks.cpp:386
+#, fuzzy
+msgid "Enter key for bookmark file encryption."
+msgstr "输入解密书签文件的密钥!"
+
+#: src/kftpbookmarks.cpp:825
+#, fuzzy
+msgid "<No Services Published>"
+msgstr "<没有公布的服务>"
+
+#: src/kftpbookmarks.cpp:830
+#, fuzzy
+msgid "<DNSSD Not Available>"
+msgstr "<没有可用的 DNSSD>"
+
+#: src/kftpbookmarks.cpp:861
+msgid "<No Sites In KWallet>"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "陆然"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "hephooey@hotmail.com"
+
+#. i18n: file ./src/ui/config_display.ui line 34
+#: rc.cpp:3
+#, no-c-format
+msgid "Displa&y"
+msgstr "显示(&Y)"
+
+#. i18n: file ./src/ui/config_display.ui line 45
+#: rc.cpp:6
+#, no-c-format
+msgid "File &Browser"
+msgstr "文件浏览器(&B)"
+
+#. i18n: file ./src/ui/config_display.ui line 56
+#: rc.cpp:9
+#, no-c-format
+msgid "Show &hidden files and directories"
+msgstr "显示隐藏的文件和目录(&H)"
+
+#. i18n: file ./src/ui/config_display.ui line 64
+#: rc.cpp:12
+#, no-c-format
+msgid "Show &directory tree"
+msgstr "显示目录树(&D)"
+
+#. i18n: file ./src/ui/config_display.ui line 72
+#: rc.cpp:15
+#, no-c-format
+msgid "Show filesi&ze in bytes (toggle for \"human readable\" format)"
+msgstr ""
+
+#. i18n: file ./src/ui/config_display.ui line 80
+#: rc.cpp:18
+#, no-c-format
+msgid "Show &owner and group for each file"
+msgstr "显示每个文件的所有者和组(&O)"
+
+#. i18n: file ./src/ui/config_display.ui line 88
+#: rc.cpp:21
+#, no-c-format
+msgid "Show directory &size"
+msgstr "显示目录大小(&S)"
+
+#. i18n: file ./src/ui/config_display.ui line 98
+#: rc.cpp:24
+#, no-c-format
+msgid "&Other Interface Elements"
+msgstr "其它界面元素(&O)"
+
+#. i18n: file ./src/ui/config_display.ui line 109
+#: rc.cpp:27
+#, fuzzy, no-c-format
+msgid "Show left sidebar"
+msgstr "显示过滤器(&F)"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 22
+#: rc.cpp:40
+#, no-c-format
+msgid "Queue Search & Replace"
+msgstr "队列搜索替换"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 36
+#: rc.cpp:43
+#, fuzzy, no-c-format
+msgid ""
+"Using this dialog, you can do massive replacing of source/destination paths of "
+"the queued transfers. <b>Changes cannot be undone.</b>"
+msgstr "通过这个对话框,您可以对传输队列的源/目标地址做大规模的替换。<b>修改将无法取消!</b>"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 44
+#: rc.cpp:46
+#, no-c-format
+msgid "Search What"
+msgstr "搜索内容"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 55
+#: rc.cpp:49 rc.cpp:79
+#, no-c-format
+msgid "Destination:"
+msgstr "目标:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 63
+#: rc.cpp:52 rc.cpp:82
+#, no-c-format
+msgid "Source:"
+msgstr "源:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 71
+#: rc.cpp:55
+#, no-c-format
+msgid "Search only for transfers on specific server"
+msgstr "仅搜索特定服务器的传输"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 82
+#: rc.cpp:58 rc.cpp:174 rc.cpp:195
+#, no-c-format
+msgid "Server Info"
+msgstr "服务器信息"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 93
+#: rc.cpp:61 rc.cpp:177 rc.cpp:198
+#, no-c-format
+msgid "Server name:"
+msgstr "服务器名:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 101
+#: rc.cpp:64 rc.cpp:180 rc.cpp:201 rc.cpp:468
+#, no-c-format
+msgid "Host:"
+msgstr "主机:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 109
+#: rc.cpp:67 rc.cpp:183 rc.cpp:204 rc.cpp:352 rc.cpp:505
+#, no-c-format
+msgid "Password:"
+msgstr "密码:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 117
+#: rc.cpp:70 rc.cpp:186 rc.cpp:207 rc.cpp:355 rc.cpp:499
+#, no-c-format
+msgid "Username:"
+msgstr "用户名:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 145
+#: rc.cpp:73 rc.cpp:189 rc.cpp:210 rc.cpp:358 rc.cpp:474
+#, no-c-format
+msgid "Port:"
+msgstr "端口:"
+
+#. i18n: file ./src/ui/kftpsearchlayout.ui line 181
+#: rc.cpp:76
+#, no-c-format
+msgid "Replace With"
+msgstr "替换为"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 16
+#: rc.cpp:85
+#, no-c-format
+msgid "Bookmark Import Wizard"
+msgstr "书签导入向导"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 23
+#: rc.cpp:88
+#, no-c-format
+msgid "Step 1: <b>Select Import Plugin</b>"
+msgstr "第一步:<b>选择导入插件</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 40
+#: rc.cpp:91 rc.cpp:109 rc.cpp:121
+#, no-c-format
+msgid "Image"
+msgstr "图像"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 56
+#: rc.cpp:94
+#, no-c-format
+msgid ""
+"Please select the appropriate import plugin from the list below. Each plugin "
+"can import from one different format."
+msgstr "请从下面的列表中选择合适的导入插件。每种插件可以导入一种不同的格式。"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 84
+#: rc.cpp:97
+#, no-c-format
+msgid "Available import plugins:"
+msgstr "可用的导入插件:"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 123
+#: rc.cpp:106
+#, no-c-format
+msgid "Step 2: <b>Select Bookmark File to Import</b>"
+msgstr "第二步:<b>选择要导入的书签文件</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 156
+#: rc.cpp:112
+#, no-c-format
+msgid ""
+"Please select the bookmark file from which you would like to import your "
+"bookmarks. A default path has already been determined by the import plugin."
+msgstr "请选择您想要导入书签的书签文件。导入插件提供了一个默认路径"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 167
+#: rc.cpp:115
+#, no-c-format
+msgid "<b>Bookmark path:</b>"
+msgstr "<b>书签文件路径:</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 201
+#: rc.cpp:118
+#, no-c-format
+msgid "Step 3: <b>Importing Bookmarks...</b>"
+msgstr "第三步:<b>导入书签...</b>"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 234
+#: rc.cpp:124
+#, no-c-format
+msgid "Please wait while the bookmarks are being imported."
+msgstr "书签正在导入,请等待"
+
+#. i18n: file ./src/ui/kftpbookmarkimportlayout.ui line 242
+#: rc.cpp:127
+#, no-c-format
+msgid "<b>Import progress:</b>"
+msgstr "<b>导入进度:</b>"
+
+#. i18n: file ./src/ui/config_log.ui line 34
+#: rc.cpp:130
+#, no-c-format
+msgid "&Appearance"
+msgstr "外观(&A)"
+
+#. i18n: file ./src/ui/config_log.ui line 45
+#: rc.cpp:133
+#, no-c-format
+msgid "Font && Colors"
+msgstr "字体和颜色"
+
+#. i18n: file ./src/ui/config_log.ui line 64
+#: rc.cpp:136
+#, no-c-format
+msgid "Font:"
+msgstr "字体:"
+
+#. i18n: file ./src/ui/config_log.ui line 87
+#: rc.cpp:139
+#, no-c-format
+msgid "Client command color:"
+msgstr "客户端命令颜色:"
+
+#. i18n: file ./src/ui/config_log.ui line 121
+#: rc.cpp:143
+#, no-c-format
+msgid "Server response color:"
+msgstr "服务器响应颜色:"
+
+#. i18n: file ./src/ui/config_log.ui line 155
+#: rc.cpp:147
+#, no-c-format
+msgid "Multiline response color:"
+msgstr "多行响应颜色:"
+
+#. i18n: file ./src/ui/config_log.ui line 189
+#: rc.cpp:151
+#, no-c-format
+msgid "Error message color:"
+msgstr "错误消息颜色:"
+
+#. i18n: file ./src/ui/config_log.ui line 223
+#: rc.cpp:155
+#, no-c-format
+msgid "Status message color:"
+msgstr "状态消息颜色:"
+
+#. i18n: file ./src/ui/config_log.ui line 270
+#: rc.cpp:159
+#, no-c-format
+msgid "&Output"
+msgstr "输出(&O)"
+
+#. i18n: file ./src/ui/config_log.ui line 281
+#: rc.cpp:162
+#, no-c-format
+msgid "&File Output"
+msgstr "文件输出(&F)"
+
+#. i18n: file ./src/ui/config_log.ui line 292
+#: rc.cpp:165
+#, fuzzy, no-c-format
+msgid "&Save log to file"
+msgstr "日志保存到文件(&S)"
+
+#. i18n: file ./src/ui/config_log.ui line 308
+#: rc.cpp:168
+#, no-c-format
+msgid "Output file:"
+msgstr "输出文件:"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 41
+#: rc.cpp:171
+#, no-c-format
+msgid "Source Server Info"
+msgstr "源服务器信息"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 141
+#: rc.cpp:192
+#, no-c-format
+msgid "Destination Server Info"
+msgstr "目标服务器信息"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 242
+#: rc.cpp:213
+#, no-c-format
+msgid "<b>Source:</b>"
+msgstr "<b>源:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 250
+#: rc.cpp:216
+#, no-c-format
+msgid "<b>Destination:</b>"
+msgstr "<b>目标:</b>"
+
+#. i18n: file ./src/ui/kftpqueueeditorlayout.ui line 266
+#: rc.cpp:219
+#, no-c-format
+msgid "Transfer type:"
+msgstr "传输类型:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 34
+#: rc.cpp:231
+#, no-c-format
+msgid "Co&nnection"
+msgstr "连接(&N)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 45
+#: rc.cpp:234
+#, fuzzy, no-c-format
+msgid "Active Connection IP"
+msgstr "活动连接设置"
+
+#. i18n: file ./src/ui/config_transfers.ui line 56
+#: rc.cpp:237
+#, fuzzy, no-c-format
+msgid "Force PORT/EPRT to &use configured IP"
+msgstr "强制 PORT/EPRT 命令使用设置的 IP"
+
+#. i18n: file ./src/ui/config_transfers.ui line 72
+#: rc.cpp:240
+#, fuzzy, no-c-format
+msgid "IP/hostname:"
+msgstr "主机名:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 95
+#: rc.cpp:243
+#, no-c-format
+msgid "&Ignore external IP for LAN connections"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 105
+#: rc.cpp:246
+#, fuzzy, no-c-format
+msgid "Active Connection Port Range"
+msgstr "活动连接设置"
+
+#. i18n: file ./src/ui/config_transfers.ui line 116
+#: rc.cpp:249
+#, no-c-format
+msgid "Onl&y use ports from the specified port range"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 132
+#: rc.cpp:252
+#, no-c-format
+msgid "Minimum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 169
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum port:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 200
+#: rc.cpp:258
+#, no-c-format
+msgid "Timeouts"
+msgstr "超时"
+
+#. i18n: file ./src/ui/config_transfers.ui line 219
+#: rc.cpp:261
+#, no-c-format
+msgid "Control connection timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 259
+#: rc.cpp:264
+#, no-c-format
+msgid "Data transfer timeout (in seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 293
+#: rc.cpp:267
+#, no-c-format
+msgid "Speed limit"
+msgstr "速度限制"
+
+#. i18n: file ./src/ui/config_transfers.ui line 312
+#: rc.cpp:270
+#, no-c-format
+msgid "Download (KB/s):"
+msgstr "下载(KB/秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 352
+#: rc.cpp:273
+#, no-c-format
+msgid "Upload (KB/s):"
+msgstr "上传(KB/秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 405
+#: rc.cpp:276
+#, no-c-format
+msgid "Dis&k Space"
+msgstr "磁盘空间(&K)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 416
+#: rc.cpp:279
+#, no-c-format
+msgid "Free Disk Space Check"
+msgstr "检查剩余磁盘空间"
+
+#. i18n: file ./src/ui/config_transfers.ui line 427
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Stop transfer if there is &not enough free space"
+msgstr "没有足够空间时停止传输"
+
+#. i18n: file ./src/ui/config_transfers.ui line 443
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Interval (sec):"
+msgstr "磁盘空间检查间隔 (秒):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 474
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Minimum free space (MiB):"
+msgstr "最小剩余空间(MB):"
+
+#. i18n: file ./src/ui/config_transfers.ui line 521
+#: rc.cpp:291
+#, no-c-format
+msgid "Thre&ads"
+msgstr "线程(&A)"
+
+#. i18n: file ./src/ui/config_transfers.ui line 551
+#: rc.cpp:297
+#, no-c-format
+msgid "Number of threads per session:"
+msgstr "每个会话的线程数:"
+
+#. i18n: file ./src/ui/config_transfers.ui line 574
+#: rc.cpp:300
+#, no-c-format
+msgid "Use the primary connection for transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 603
+#: rc.cpp:303
+#, no-c-format
+msgid "&Miscellaneous"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 625
+#: rc.cpp:309
+#, no-c-format
+msgid "Automatically retry failed transfers"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 641
+#: rc.cpp:312
+#, no-c-format
+msgid "Maximum number of retries before marking as failed:"
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 666
+#: rc.cpp:315
+#, no-c-format
+msgid "Other"
+msgstr "其它"
+
+#. i18n: file ./src/ui/config_transfers.ui line 677
+#: rc.cpp:318
+#, no-c-format
+msgid "&Queue files (instead of transferring) when \"dragged && dropped\""
+msgstr ""
+
+#. i18n: file ./src/ui/config_transfers.ui line 685
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Skip &empty directories when queueing"
+msgstr "跳过空目录"
+
+#. i18n: file ./src/ui/config_transfers.ui line 693
+#: rc.cpp:324
+#, no-c-format
+msgid "Confirm disconnects &before disconnecting"
+msgstr "断开连接前确认(&B)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 16
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "ftpSiteProperties"
+msgstr "属性(&P)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 61
+#: rc.cpp:333
+#, no-c-format
+msgid "Hostname:"
+msgstr "主机名:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 69
+#: rc.cpp:336 rc.cpp:477
+#, no-c-format
+msgid "Protocol:"
+msgstr "协议:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 83
+#: rc.cpp:339 rc.cpp:480
+#, no-c-format
+msgid "FTP"
+msgstr "FTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 88
+#: rc.cpp:342 rc.cpp:483
+#, no-c-format
+msgid "FTP over TLS/SSL (explicit)"
+msgstr "基于 TLS/SSL 的 FTP (explicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 93
+#: rc.cpp:345 rc.cpp:486
+#, no-c-format
+msgid "FTP over TLS/SSL (implicit)"
+msgstr "基于 TLS/SSL 的 FTP (implicit)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 98
+#: rc.cpp:348 rc.cpp:489
+#, no-c-format
+msgid "SFTP over SSH2"
+msgstr "基于 SSH2 的 SFTP"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 183
+#: rc.cpp:361
+#, no-c-format
+msgid "Site label:"
+msgstr "站点标签:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 196
+#: rc.cpp:364
+#, no-c-format
+msgid "Remote directory:"
+msgstr "远程目录:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 204
+#: rc.cpp:367 rc.cpp:583
+#, no-c-format
+msgid "Local directory:"
+msgstr "本地目录:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 227
+#: rc.cpp:370
+#, fuzzy, no-c-format
+msgid "&Anonymous login"
+msgstr "匿名登录"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 257
+#: rc.cpp:376
+#, fuzzy, no-c-format
+msgid "&Advanced"
+msgstr "高级"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 268
+#: rc.cpp:379
+#, fuzzy, no-c-format
+msgid "Disa&ble use of extended passive mode"
+msgstr "禁用扩展的被动模式"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 276
+#: rc.cpp:382
+#, no-c-format
+msgid "Disable use of passive mode"
+msgstr "禁用被动模式"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 284
+#: rc.cpp:385
+#, no-c-format
+msgid "Use site IP for passive mode connections"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 292
+#: rc.cpp:388
+#, no-c-format
+msgid "Disable \"force active mode to use this IP\" for this site"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 300
+#: rc.cpp:391
+#, fuzzy, no-c-format
+msgid "Use STAT for directory listings"
+msgstr "目录不在缓存中!"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 311
+#: rc.cpp:395
+#, no-c-format
+msgid "Multiple Transfer Threads"
+msgstr "多个传输线程"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 322
+#: rc.cpp:398
+#, no-c-format
+msgid "Do not use multiple threads for this site"
+msgstr "不对这个站点使用多线程"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 332
+#: rc.cpp:401 rc.cpp:517
+#, no-c-format
+msgid "Server Encoding"
+msgstr "服务器编码"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 347
+#: rc.cpp:404 rc.cpp:520 rc.cpp:592
+#, no-c-format
+msgid "Encoding:"
+msgstr "编码:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 396
+#: rc.cpp:407
+#, no-c-format
+msgid "Retry && &Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 407
+#: rc.cpp:410
+#, no-c-format
+msgid "Retr&y to connect on failure"
+msgstr "失败后重新尝试连接(&Y)"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 423
+#: rc.cpp:413
+#, no-c-format
+msgid "Retry"
+msgstr "重试"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 434
+#: rc.cpp:416 rc.cpp:589
+#, no-c-format
+msgid "Number of retries (0 = infinite):"
+msgstr "重试次数(0 = 无限制):"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 442
+#: rc.cpp:419 rc.cpp:586
+#, no-c-format
+msgid "Retry delay:"
+msgstr "重试延时:"
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 505
+#: rc.cpp:422
+#, no-c-format
+msgid "Use keepalive packets to keep the connection open"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 513
+#: rc.cpp:425
+#, no-c-format
+msgid "Keepalive"
+msgstr ""
+
+#. i18n: file ./src/ui/bookmark_properties.ui line 532
+#: rc.cpp:428
+#, no-c-format
+msgid "Keepalive frequency (seconds):"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 16
+#: rc.cpp:431
+#, no-c-format
+msgid "KFTPFilterEditorLayout"
+msgstr ""
+
+#. i18n: file ./src/ui/config_filters.ui line 34
+#: rc.cpp:434
+#, no-c-format
+msgid "ASCII E&xtensions"
+msgstr "ASCII 扩展名(&X)"
+
+#. i18n: file ./src/ui/config_filters.ui line 70
+#: rc.cpp:437
+#, no-c-format
+msgid "Add Extension"
+msgstr "添加扩展名"
+
+#. i18n: file ./src/ui/config_filters.ui line 96
+#: rc.cpp:443
+#, no-c-format
+msgid "Extension:"
+msgstr "扩展名:"
+
+#. i18n: file ./src/ui/config_filters.ui line 107
+#: rc.cpp:446
+#, no-c-format
+msgid "Extension"
+msgstr "扩展名"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 64
+#: rc.cpp:452
+#, no-c-format
+msgid "Recent connections"
+msgstr "最近的连接"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 91
+#: rc.cpp:455
+#, no-c-format
+msgid "Select connection:"
+msgstr "选择连接:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 171
+#: rc.cpp:462
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 179
+#: rc.cpp:465
+#, no-c-format
+msgid "Enter the whole url into this box"
+msgstr "在这个对话框内输入完整的 URL"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 219
+#: rc.cpp:471
+#, no-c-format
+msgid "Enter ftp's hostname"
+msgstr "输入 FTP 主机名"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 321
+#: rc.cpp:493
+#, no-c-format
+msgid "Anon&ymous login"
+msgstr "匿名登录(&Y)"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 324
+#: rc.cpp:496
+#, no-c-format
+msgid "Check for anonymous login"
+msgstr "选中使用匿名登录"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 362
+#: rc.cpp:502
+#, no-c-format
+msgid "Enter account username"
+msgstr "输入帐户的用户名"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 402
+#: rc.cpp:508
+#, no-c-format
+msgid "Enter account password"
+msgstr "输入帐户的密码"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 412
+#: rc.cpp:511
+#, no-c-format
+msgid "Add to &bookmarks"
+msgstr "添加到书签(&B)"
+
+#. i18n: file ./src/ui/kftpquickconnectlayout.ui line 441
+#: rc.cpp:514
+#, no-c-format
+msgid "Advanced"
+msgstr "高级"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 41
+#: rc.cpp:523
+#, no-c-format
+msgid "Data Connection Settings"
+msgstr "数据连接设置"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 68
+#: rc.cpp:526
+#, no-c-format
+msgid "Mode:"
+msgstr "模式:"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 74
+#: rc.cpp:529
+#, no-c-format
+msgid "Always encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 79
+#: rc.cpp:532
+#, fuzzy, no-c-format
+msgid "Encrypt only for directory listings"
+msgstr "目录不在缓存中!"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 84
+#: rc.cpp:535
+#, no-c-format
+msgid "Do not encrypt the data channel"
+msgstr ""
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 108
+#: rc.cpp:538
+#, no-c-format
+msgid "X509 Certificate"
+msgstr "X509 证书"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 119
+#: rc.cpp:541
+#, no-c-format
+msgid "Use the following SSL certificate when connecting"
+msgstr "连接时使用下面的 SSL 证书"
+
+#. i18n: file ./src/ui/kftpbookmarkeditortlswidget.ui line 135
+#: rc.cpp:544
+#, no-c-format
+msgid "Path:"
+msgstr "路径:"
+
+#. i18n: file ./src/ui/config_general.ui line 45
+#: rc.cpp:550
+#, no-c-format
+msgid "E-mail &Address"
+msgstr "电子邮件地址(&A)"
+
+#. i18n: file ./src/ui/config_general.ui line 56
+#: rc.cpp:553
+#, no-c-format
+msgid "&Use e-mail address from control center"
+msgstr "使用控制中心的电子邮件地址(&U)"
+
+#. i18n: file ./src/ui/config_general.ui line 72
+#: rc.cpp:556
+#, no-c-format
+msgid "E-mail:"
+msgstr "电子邮件:"
+
+#. i18n: file ./src/ui/config_general.ui line 89
+#: rc.cpp:559
+#, no-c-format
+msgid "Startup and Exit"
+msgstr "启动和退出"
+
+#. i18n: file ./src/ui/config_general.ui line 100
+#: rc.cpp:562
+#, no-c-format
+msgid "Confirm program e&xit if there are active transfers"
+msgstr "当有活动传输时退出程序要求确认(&X)"
+
+#. i18n: file ./src/ui/config_general.ui line 108
+#: rc.cpp:565
+#, no-c-format
+msgid "Start the program minimi&zed to systray"
+msgstr "程序启动后最小化到系统托盘(&Z)"
+
+#. i18n: file ./src/ui/config_general.ui line 116
+#: rc.cpp:568
+#, no-c-format
+msgid "Show &splash screen on startup"
+msgstr "启动时显示启动画面(&S)"
+
+#. i18n: file ./src/ui/config_general.ui line 124
+#: rc.cpp:571
+#, fuzzy, no-c-format
+msgid "Show the s&ystray icon"
+msgstr "跳过空目录"
+
+#. i18n: file ./src/ui/config_general.ui line 132
+#: rc.cpp:574
+#, no-c-format
+msgid "Ex&it by default when clicking the X button"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 180
+#: rc.cpp:580
+#, fuzzy, no-c-format
+msgid "Site Defaults"
+msgstr "文件传输的默认值"
+
+#. i18n: file ./src/ui/config_general.ui line 328
+#: rc.cpp:598
+#, fuzzy, no-c-format
+msgid "Encr&ypt bookmark file"
+msgstr "加密书签文件"
+
+#. i18n: file ./src/ui/config_general.ui line 336
+#: rc.cpp:601
+#, no-c-format
+msgid "&Show sites from KWallet among bookmarks"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 365
+#: rc.cpp:604
+#, fuzzy, no-c-format
+msgid "&Notification"
+msgstr "通知选项"
+
+#. i18n: file ./src/ui/config_general.ui line 376
+#: rc.cpp:607
+#, no-c-format
+msgid "Balloons"
+msgstr ""
+
+#. i18n: file ./src/ui/config_general.ui line 387
+#: rc.cpp:610
+#, fuzzy, no-c-format
+msgid "&Show balloon when transfer completes"
+msgstr "传输完成时显示气泡"
+
+#. i18n: file ./src/ui/config_general.ui line 395
+#: rc.cpp:613
+#, fuzzy, no-c-format
+msgid "Only show when &queue is empty after transfer"
+msgstr "仅当传输完成后队列为空的时候显示"
+
+#. i18n: file ./src/ui/config_general.ui line 403
+#: rc.cpp:616
+#, fuzzy, no-c-format
+msgid "Show balloon when connection retr&y succeeds"
+msgstr "当重试连接成功是显示气泡"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 68
+#: rc.cpp:622
+#, fuzzy, no-c-format
+msgid "<b>File:</b>"
+msgstr "<b>源:</b>"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 84
+#: rc.cpp:625
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 96
+#: rc.cpp:628
+#, fuzzy, no-c-format
+msgid "File list"
+msgstr "文件已存在"
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 165
+#: rc.cpp:632
+#, no-c-format
+msgid "Unprocessed"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 212
+#: rc.cpp:636
+#, no-c-format
+msgid "Ok"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 259
+#: rc.cpp:640
+#, no-c-format
+msgid "Not found"
+msgstr ""
+
+#. i18n: file ./src/ui/checksum_verifier.ui line 306
+#: rc.cpp:644
+#, fuzzy, no-c-format
+msgid "Failed"
+msgstr "过滤器"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 16
+#: rc.cpp:647
+#, no-c-format
+msgid "The size of the main window."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 20
+#: rc.cpp:650
+#, no-c-format
+msgid "The position of the main window on the screen."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 28
+#: rc.cpp:653
+#, no-c-format
+msgid "The default retry count for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 34
+#: rc.cpp:656
+#, no-c-format
+msgid "The default retry delay for new sites."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 39
+#: rc.cpp:659
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when some actions complete."
+msgstr "传输完成时显示气泡"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 44
+#: rc.cpp:662
+#, fuzzy, no-c-format
+msgid "Should a balloon be displayed when all queued transfers are completed."
+msgstr "传输完成时显示气泡"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 49
+#: rc.cpp:665
+#, no-c-format
+msgid ""
+"Should a balloon be displayed when a connection to the server is successfully "
+"established after retrying."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 54
+#: rc.cpp:668
+#, fuzzy, no-c-format
+msgid "Should the user confirm exit if there are transfers running."
+msgstr "当有活动传输时退出程序要求确认"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 59
+#: rc.cpp:671
+#, fuzzy, no-c-format
+msgid "Encryption status of the bookmarks file."
+msgstr "加密书签文件"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 64
+#: rc.cpp:674
+#, fuzzy, no-c-format
+msgid "Default local directory."
+msgstr "默认本地目录:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 69
+#: rc.cpp:677
+#, no-c-format
+msgid "Should the application exit when users clicks the X button."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 74
+#: rc.cpp:680
+#, no-c-format
+msgid "Should the application be started minimized."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 79
+#: rc.cpp:683
+#, no-c-format
+msgid "Should the splash screen be displayed when starting the application."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 84
+#: rc.cpp:686
+#, fuzzy, no-c-format
+msgid "Should the systray icon be displayed."
+msgstr "跳过空目录"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 89
+#: rc.cpp:689
+#, no-c-format
+msgid "Should the sites from KWallet be shown among the bookmarks."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 94
+#: rc.cpp:692
+#, no-c-format
+msgid ""
+"Should a \"confirm disconnect\" dialog be displayed each time a disconnect is "
+"requested."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 99
+#: rc.cpp:695
+#, no-c-format
+msgid "The default site encoding."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 103
+#: rc.cpp:698
+#, no-c-format
+msgid "Recent sites accessed via quick connect."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 124
+#: rc.cpp:701
+#, no-c-format
+msgid "A list of file patters where ASCII mode should be used for transfer."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 129
+#: rc.cpp:704
+#, fuzzy, no-c-format
+msgid "Should empty directories be skipped."
+msgstr "跳过空目录"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 135
+#: rc.cpp:707
+#, no-c-format
+msgid "The font that should be used for the log widget."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 141
+#: rc.cpp:710
+#, fuzzy, no-c-format
+msgid "The color of the commands sent to the server."
+msgstr "无法打开目录!"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 146
+#: rc.cpp:713
+#, no-c-format
+msgid "The color of the responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 151
+#: rc.cpp:716
+#, no-c-format
+msgid "The color of the multiline responses from the server."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 156
+#: rc.cpp:719
+#, no-c-format
+msgid "The color of the error messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 161
+#: rc.cpp:722
+#, no-c-format
+msgid "The color of the status messages."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 166
+#: rc.cpp:725
+#, no-c-format
+msgid "Should the log be written to a file as well."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 170
+#: rc.cpp:728
+#, no-c-format
+msgid "The file to which the log should be written."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 177
+#: rc.cpp:731
+#, no-c-format
+msgid ""
+"Should a port from a specified portrange be selected on active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 184
+#: rc.cpp:734
+#, no-c-format
+msgid "The start of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 191
+#: rc.cpp:737
+#, no-c-format
+msgid "The end of the portrange."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 196
+#: rc.cpp:740
+#, no-c-format
+msgid "Should an IP be overriden when doing active transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 200
+#: rc.cpp:743
+#, no-c-format
+msgid "The IP to be sent when overriding the PORT command."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 205
+#: rc.cpp:746
+#, no-c-format
+msgid "Should the external IP be ignored for LAN connections."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 210
+#: rc.cpp:749
+#, no-c-format
+msgid ""
+"Should the transfers be queued insted of started when using drag and drop."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 215
+#: rc.cpp:752
+#, no-c-format
+msgid ""
+"Should kftpgrabber check for free space and abort the transfer when there is "
+"not enough free."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 221
+#: rc.cpp:755
+#, no-c-format
+msgid "Interval for disk checking."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 227
+#: rc.cpp:758
+#, no-c-format
+msgid "Minimum free space (in MiB) that must be available."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 232
+#: rc.cpp:761
+#, no-c-format
+msgid "Use global KDE e-mail address for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 237
+#: rc.cpp:764
+#, no-c-format
+msgid "The e-mail address that should be used for anonymous passwords."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 244
+#: rc.cpp:767
+#, fuzzy, no-c-format
+msgid "Number of threads to use when transfering."
+msgstr "每个会话的线程数:"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 249
+#: rc.cpp:770
+#, fuzzy, no-c-format
+msgid "Should the primary connection be used for transfers."
+msgstr "当有活动传输时退出程序要求确认"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 255
+#: rc.cpp:773
+#, no-c-format
+msgid "Timeout (in seconds) for the control connection."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 262
+#: rc.cpp:776
+#, no-c-format
+msgid "Timeout (in seconds) for data transfers."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 267
+#: rc.cpp:779
+#, no-c-format
+msgid "Global download speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 272
+#: rc.cpp:782
+#, no-c-format
+msgid "Global upload speed limit (kbytes/s)."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 277
+#: rc.cpp:785
+#, no-c-format
+msgid "Should failed transfers be automaticly retried."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 284
+#: rc.cpp:788
+#, no-c-format
+msgid "Maximum number of retries before marking transfer as failed."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 291
+#: rc.cpp:791
+#, no-c-format
+msgid "Should the directory tree be shown by default."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 296
+#: rc.cpp:794
+#, no-c-format
+msgid "Should hidden files be shown when browsing."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 301
+#: rc.cpp:797
+#, no-c-format
+msgid ""
+"Should the filesize be shown in bytes rather than in \"human readable\" form."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 306
+#: rc.cpp:800
+#, no-c-format
+msgid "Should the owner and group be shown for each file."
+msgstr ""
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 311
+#: rc.cpp:803
+#, no-c-format
+msgid "Show directory size."
+msgstr "显示目录大小。"
+
+#. i18n: file ./src/misc/kftpgrabber.kcfg line 316
+#: rc.cpp:806
+#, no-c-format
+msgid "Show left sidebar."
+msgstr "显示左侧边栏。"
+
+#. i18n: file ./src/kftpgrabberui.rc line 5
+#: rc.cpp:809
+#, no-c-format
+msgid "Main Menu"
+msgstr "主菜单"
+
+#. i18n: file ./src/kftpgrabberui.rc line 24
+#: rc.cpp:818
+#, no-c-format
+msgid "Bookmark Toolbar"
+msgstr "书签工具栏"
+
+#~ msgid "No username specified for '%1'."
+#~ msgstr "“%1”未指定用户名。"
+
+#~ msgid "Error Connecting"
+#~ msgstr "连接错误"
+
+#~ msgid "DisplaySettings"
+#~ msgstr "显示设置"
+
+#, fuzzy
+#~ msgid "KFTPQuickConnectLayout"
+#~ msgstr "快速连接"